Quantcast
Channel: Rhino Developer - McNeel Forum
Viewing all 8634 articles
Browse latest View live

Rhino Bug: HiddenLineDrawing.Compute

$
0
0

@Matthieu_from_NAVINN wrote:

Hi,
I’ve got a huge issue with the latest Rhino releases: the result of HiddenLineDrawing.Compute().segments is not computed anymore, or rather the output is missing:

HiddenLineDrawingSegment.parentcurve => nothing
HiddenLineDrawingSegment.geometry => unsolved

It used to work perfectly with rhino 6 SR9, and it fails with SR14 or later releases. I also tried to force compilation with various rhinocommon versions, but it does not change the issue so Rhino itself has most probably something wrong.

Here is a more detailed sample of code, based on @dale exemple:

Dim HLDParam As New Rhino.Geometry.HiddenLineDrawingParameters
            HLDParam.AbsoluteTolerance = doc.ModelAbsoluteTolerance
            HLDParam.Flatten = True
            HLDParam.IncludeHiddenCurves = True
            HLDParam.IncludeTangentEdges = False
            HLDParam.IncludeTangentSeams = False
            HLDParam.AddClippingPlane(New Plane(Plane.WorldZX) With {.OriginY = Y})
            For Each obj In doc.Objects
                HLDParam.AddGeometry(obj.Geometry, obj.Attributes)
            Next
            HLDParam.SetViewport(viewport)
 Dim HLD As HiddenLineDrawing = Rhino.Geometry.HiddenLineDrawing.Compute(HLDParam, False)
If HLD Is Nothing Then Exit Sub
For Each HLD_Segment As HiddenLineDrawingSegment In HLD.Segments
Dim attr As ObjectAttributes = TryCast(HLD_Segment.ParentCurve.SourceObject.Tag, ObjectAttributes).duplicate
Dim c As Curve = HLD_Segment.CurveGeometry.DuplicateCurve()
...
Next

Posts: 1

Participants: 1

Read full topic


Help Scripting a repetitive process of Exports and View Captures

$
0
0

@corey.hokanson wrote:

Hi everyone!

So, I work with architectural models & Mass Timber components (glu-lams, CLT, MPP, etc). When we get the model dialed in, I export each piece individually so we can create the shop drawings for them. As part of this process, we also “highlight” the selected piece and capture the view, then insert that into the shop drawing for context.

Anyways, I want to script the repetitive portion of that process. Here’s the step-by-step…

0 - For each unique “name” repeat 1-6
1 - Select all instances of parts with the same name
2 - Export selected
-Save to [Proj_dir]/Exports/[PartName]_SD.3DM
-Save without plugin data / textures
3 - Set Display Color (of selected objects) to Red (or other “highlight” color)
4 - Invert Selection
5 - Set Display Color (of selected objects) to Black (or other “neutral” color)
6 - Capture display to file
-Current View
-Transparent Background
-Resolution (viewport)
-Save to [Proj_dir]/Exports/[PartName]_Highlight.png

I’m pretty sure I can create a simple “button” macro for 3-5. Not sure how to include the parameters for 2 or 6. I have absolutely no clue where to start on programmatically looping through all parts in the model (or in certain layers) by name… My programming experience is mostly in Visual Basic / TI Basic. I have familiarity with Java / C++, at least enough to read / check / tweak. I’ve never coded anything for Rhino though.

With all the options, would this be a task best suited for RhinoScript, Python, or Grasshopper? Whichever one, can you help point me in the right direction to start my research / learning on how? I mean, if you can provide code for what I’m looking for that’s awesome too, but I’m mostly interested in learning how to do these things.

Thanks!

Posts: 1

Participants: 1

Read full topic

Why the iges input result is polysurface?

$
0
0

@jerry1 wrote:

testfff.igs (1.4 MB)

Hi all,
I have a iges file, see the attached file, I check its data format only has
one surface(144/142 iges system), but when I import to Rhino, its result
is polysurface? how to avoid this situation? how to set the parameter to repair ?
thanks

Posts: 1

Participants: 1

Read full topic

Reported surface.domain doesn't seem accurate

$
0
0

@gruedisueli wrote:

Hi,
I’m trying to get evenly-spaced isocurves along a pipe surface in one direction (V-direction) (via c# script).

My approach has been as follows: 1) find the biggest surface on the pipe (it has rounded ends, but I only want the body of the pipe), 2) get the span of the domain in the V direction, 3) divide it by some step value, and 4) extract an isocurve at each division point.

The c# is here, but also embedded in my attached gh file.

private void RunScript(Brep brep, ref object isoCurves, ref object vDomain, ref object pipe)
{

//first, we are just processing the pipe to find the biggest surface/face
//that's the face I want to get evenly-spaced isocurves from.
Surface[] faces = new Surface[brep.Faces.Count];
double[] areas = new double[brep.Faces.Count];

for (int i = 0; i < brep.Faces.Count; i++)
{
  Surface s = brep.Faces[i].DuplicateSurface();
  areas[i] = AreaMassProperties.Compute(s).Area;
  faces[i] = s;

}

Array.Sort(areas, faces);
Array.Reverse(faces);

Surface p = faces[0];




//now, the meat of the issue:
//reported domain for surface doesn't seem to extend over entire domain
//in GH you will see an output domain of 0 to 3 * pi
//my basic process is as follows:


//find entire domain in V direction
Interval vD = p.Domain(1);
//divide it by some number (20)
double divStep = vD.Length / 20;
//step through the v-domain, getting the isocurves.
List<Curve> isoCrvs = new List<Curve>();
for (double d = vD.Min; d < vD.Max; d += divStep)
{
  Curve iC = p.IsoCurve(1, d);
  isoCrvs.Add(iC);
}
isoCurves = isoCrvs;
vDomain = vD;
pipe = p;

}

I’ve found that when I try to do this, specifically with a piped surface, I get a series of isocurves in the V-direction, but only over a portion of the surface. The reported domain via Surface.Domain is not the entire domain of the surface. The reported domain for my pipe surface in the V-direction is 0 to 3 * pi. When I extract an isocurve at 3 * pi either via c# script or via grasshopper components, I get an isocurve located midway through the surface, not at one of the ends. This curve also corresponds with the last curve in my series of isocurves. I can, however, sample the surface at a UV point outside of this 3 * pi bounds, and get an isocurve that is theoretically out of bounds but which indeed exists on the surface.

For an example, please see the attached rhino file and gh script (with embedded c# component). I also put some tests in there. My test c# is on the left and the other tests I did to verify things are on the right.

test_extract even isocurves.3dm (172.2 KB) test extract isocurves.gh (18.0 KB)

Posts: 1

Participants: 1

Read full topic

Iscurvelinear or isline

$
0
0

@0904 wrote:

in rhinoscript: what differences between “iscurvelinear” and “isline”?

Posts: 2

Participants: 2

Read full topic

I can't find the knotremoval function

$
0
0

@jerry1 wrote:

Hi everyone,

recently I want to remove some knots for my Rhino.Geometry.NurbsSurface, when I expand the function list, the knotinsertion appear, but the knotremoval disappear?
could anyone tell me how to do? thanks.

Posts: 1

Participants: 1

Read full topic

Apply MakeUniform command using RhinoCommon

$
0
0

@software_comas wrote:

Hi guys!
As you can read here seems that Rhino can’t calc surfaces intersections properly, in some cases.
As suggested, i would like to apply something like “MakeUniform” command to a surface, but using C# code.
I tried to search something useful in the RhinoCommon SDK but i found nothing…
Can you help me?
Thanks! :slight_smile:

Posts: 1

Participants: 1

Read full topic

In LayerTableEvent, Layer.CopyAttributesFrom is incorrectly copying the FullPath property

$
0
0

@marcsyp wrote:

In a LayerTableEvent callback, I am copying Layer properties from the OldState event property to store for later comparison (and to prevent corruption by accessing the state directly in solveInstance). The call looks like this:

Layer oldState = new Layer();
if (e.OldState != null) oldState.CopyAttributesFrom(e.OldState);

The problem is that the e.OldState.FullPath is “something::hi”, but the copied oldState.FullPath is just “hi”. It looks like it is truncating the FullPath into just the layer name.

Am I missing something?

Thanks,
Marc

Posts: 4

Participants: 2

Read full topic


SporphSpaceMorph not working

$
0
0

@gianfranco74 wrote:

Hi all.
I’m trying to flow from srf0 to srf1 a set of points on srf0. Something is not working. Morph is not valid and if i create the points they are on srf0 .
Here there is a command and a file 3dm rhino6 you can try.
test.cs (5.6 KB)
test_morph.3dm (88.1 KB)

Posts: 1

Participants: 1

Read full topic

Problem in running my plugin command

Any examples of RhinoGet1RailFrames

DrawMeshFalseColors one sided?

$
0
0

@sarg wrote:

Any way to apply DrawMeshFalseColors to (only) one side of a mesh? If not, can I add this as a wish list item :slight_smile: ? It’s often useful to render falsecolors on only one side of a surface, as when showing an oriented measurement (like radiant flux). The effect can be achieved with bitmap textures (below), but there are cases when I need to use vertex colors instead.

Cheers,

Jon

Posts: 1

Participants: 1

Read full topic

S-S-S-Snake!

$
0
0

@ChristopherBotha wrote:

Scrabbled together from a bunch of bits of code from the web and actually written to test the keyboard hook written by @dale.

U-D-L-R to control, ENTER for new game, SHIFT+X to exit.

Download Snake.rhp (13 KB)

Code: (in case anyone else has an hour to kill :wink:

using Rhino;
using Rhino.Commands;
using Rhino.Display;
using Rhino.Geometry;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Snake
{
    [System.Runtime.InteropServices.Guid("d6722cf1-6eea-4d74-b412-14f958452dff")]
    public class SnakeCommand : Command
    {
        public SnakeCommand() { Instance = this; }
        public static SnakeCommand Instance { get; private set; }
        public override string EnglishName { get { return "SnakeCommand"; } }
        private readonly KbListener KeyPress = new KbListener();
        public static List<SnakePosition> Snake = new List<SnakePosition>();
        public static SnakePosition food = new SnakePosition();
        public static SnakeDisplay sn = new SnakeDisplay();
        public static int PlayFieldWidth = 50;
        public static int PlayFieldHeight = 50;
        public static Timer gameTimer = new Timer();
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            new GameSettings();
            gameTimer.Interval = 250 / GameSettings.Speed;
            gameTimer.Tick += UpdateScreen;
            gameTimer.Start();
            sn.Enabled = true;
            StartGame();
            KeyPress.Enabled = true;
            return Result.Success;
        }


        private void StartGame()
        {
            new GameSettings();
            Snake.Clear();
            SnakePosition head = new SnakePosition { X = 10, Y = 10 };
            Snake.Add(head);
            RhinoApp.WriteLine(GameSettings.Score.ToString());
            GenerateFood();

        }
        private void GenerateFood()
        {
            int maxXPos = PlayFieldWidth / GameSettings.Width;
            int maxYPos = PlayFieldHeight / GameSettings.Height;
            Random random = new Random();
            food = new SnakePosition { X = random.Next(0, maxXPos), Y = random.Next(0, maxYPos) };
        }
        private void UpdateScreen(object sender, EventArgs e)
        {
            gameTimer.Interval = 250 / GameSettings.Speed;
            //Check for Game Over
            if (GameSettings.GameOver)
            {
                //Check if Enter is pressed
                if (Input.KeyPressed(Keys.Enter))
                {
                    StartGame();
                }
                if (Input.KeyPressed(Keys.X))
                {
                    gameTimer.Stop();
                    gameTimer.Dispose();
                    sn.Enabled = false;
                    KeyPress.Enabled = false;
                }

            }
            else
            {
                if (Input.KeyPressed(Keys.Right) && GameSettings.direction != Direction.Left)
                {
                    GameSettings.direction = Direction.Right;
                }
                else if (Input.KeyPressed(Keys.Left) && GameSettings.direction != Direction.Right)
                {
                    GameSettings.direction = Direction.Left;
                }
                else if (Input.KeyPressed(Keys.Up) && GameSettings.direction != Direction.Down)
                {
                    GameSettings.direction = Direction.Up;
                }
                else if (Input.KeyPressed(Keys.Down) && GameSettings.direction != Direction.Up)
                {
                    GameSettings.direction = Direction.Down;
                }

                MovePlayer();
            }
            RhinoDoc.ActiveDoc.Views.Redraw();
        }
        private void MovePlayer()
        {
            for (int i = Snake.Count - 1; i >= 0; i--)
            {
                //Move head
                if (i == 0)
                {
                    switch (GameSettings.direction)
                    {
                        case Direction.Right:
                            Snake[i].X++;
                            break;
                        case Direction.Left:
                            Snake[i].X--;
                            break;
                        case Direction.Up:
                            Snake[i].Y++;
                            break;
                        case Direction.Down:
                            Snake[i].Y--;
                            break;
                    }


                    //Get maximum X and Y Pos
                    int maxXPos = PlayFieldWidth / GameSettings.Width;
                    int maxYPos = PlayFieldHeight / GameSettings.Height;

                    //Detect collission with game borders.
                    if (Snake[i].X < 0 || Snake[i].Y < 0
                        || Snake[i].X >= maxXPos || Snake[i].Y >= maxYPos)
                    {
                        Die();
                    }


                    //Detect collission with body
                    for (int j = 1; j < Snake.Count; j++)
                    {
                        if (Snake[i].X == Snake[j].X &&
                           Snake[i].Y == Snake[j].Y)
                        {
                            Die();
                        }
                    }

                    //Detect collision with food piece
                    if (Snake[0].X == food.X && Snake[0].Y == food.Y)
                    {
                        Eat();
                    }

                }
                else
                {
                    //Move body
                    Snake[i].X = Snake[i - 1].X;
                    Snake[i].Y = Snake[i - 1].Y;
                }
            }
        }

        private void Eat()
        {
            SnakePosition circle = new SnakePosition
            {
                X = Snake[Snake.Count - 1].X,
                Y = Snake[Snake.Count - 1].Y
            };
            Snake.Add(circle);
            GameSettings.Score += GameSettings.Points;
            GenerateFood();
        }
        private void Die()
        {
            GameSettings.GameOver = true;
        }


    }

    internal class Input
    {
        private static Hashtable keyTable = new Hashtable();
        public static bool KeyPressed(Keys key)
        {
            if (keyTable[key] == null)
            {
                return false;
            }

            return (bool)keyTable[key];
        }
        public static void ChangeState(Keys key, bool state)
        {
            keyTable[key] = state;
        }
    }
    public enum Direction
    {
        Up,
        Down,
        Left,
        Right
    };
    public class GameSettings
    {
        public static int Width { get; set; }
        public static int Height { get; set; }
        public static int Speed { get; set; }
        public static int Score { get; set; }
        public static int Points { get; set; }
        public static bool GameOver { get; set; }
        public static Direction direction { get; set; }

        public GameSettings()
        {
            Width = 2;
            Height = 2;
            Speed = 2;
            Score = 0;
            Points = 1;
            GameOver = false;
            direction = Direction.Down;
        }
    }
    public class SnakePosition
    {
        public int X { get; set; }
        public int Y { get; set; }
        public SnakePosition(){X = 0;Y = 0;}
    }

    public class SnakeDisplay : DisplayConduit
    {
        private List<Brep> SnakeBody = new List<Brep>();

        protected override void CalculateBoundingBox(CalculateBoundingBoxEventArgs e)
        {
            base.CalculateBoundingBox(e);
            e.IncludeBoundingBox(new BoundingBox(
                    new Point3d((GameSettings.Width / 2) * -1, (GameSettings.Width / 2) * -1, -10),
                    new Point3d(SnakeCommand.PlayFieldWidth, SnakeCommand.PlayFieldHeight, 10)));
        }

        protected override void DrawForeground(DrawEventArgs e)
        {

            if (SnakeCommand.Snake.Count != 0)
            {
                e.Display.DrawBox(new BoundingBox(
                    new Point3d((GameSettings.Width / 2) * -1, (GameSettings.Width / 2) * -1, 0),
                    new Point3d(SnakeCommand.PlayFieldWidth, SnakeCommand.PlayFieldHeight, 0)),
                Color.DarkCyan,3);

                if (!GameSettings.GameOver)
                {
                    SnakeBody.Clear();
                    foreach (SnakePosition position in SnakeCommand.Snake)
                    {
                        e.Display.DrawSphere(
                            new Sphere(new Point3d(position.X * GameSettings.Width, position.Y * GameSettings.Height, 0), GameSettings.Width / 2), Color.DarkRed);
                    }
                    e.Display.DrawSphere(
                            new Sphere(new Point3d(SnakeCommand.food.X * GameSettings.Width, SnakeCommand.food.Y * GameSettings.Height, 0), GameSettings.Width / 2), Color.DarkGreen);
                    var Text = new Text3d(GameSettings.Score.ToString(), Plane.WorldXY, 5);
                    e.Display.Draw3dText(Text, Color.Blue, new Point3d(20, 20, 0));
                }
                else
                {
                    RhinoApp.WriteLine("Game over! Score: " + GameSettings.Score + " Enter to try again or SHIFT+X to exit.");
                }
            }
        }
    }
    public abstract class KeyboardCallback
    {

        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_KEYUP = 0x101;
        private readonly LowLevelKeyboardProc _proc;
        private static IntPtr _hookID = IntPtr.Zero;

        protected KeyboardCallback()
        {
            _proc = HookCallback;
        }

        private bool _enabled;
        public bool Enabled
        {
            get { return _enabled; }

            set
            {
                _enabled = value;
                if (_enabled)
                {
                    _hookID = SetHook(_proc);
                }
                else
                {
                    bool unhooked = UnhookWindowsHookEx(_hookID);
                    if (!unhooked)
                    {
                        Trace.TraceError("Unable to unhook low-level keyboard hook");
                    }
                }
            }
        }

        private IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }


        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

        private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                IntPtr foregroundWindow = GetForegroundWindow();
                IntPtr undefined = (IntPtr)(-1);
                if (foregroundWindow == undefined)
                {
                    return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam);
                }

                uint processID;
                GetWindowThreadProcessId(foregroundWindow, out processID);

                uint currentProcessID = GetCurrentProcessId();
                if (processID != currentProcessID) // foreground window is not my process
                {
                    return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam);
                }

                if (wParam == (IntPtr)WM_KEYDOWN)
                {
                    int vkCode = Marshal.ReadInt32(lParam);
                    bool handled = false;
                    OnKeyDown((Keys)vkCode, ref handled);
                    if (handled)
                    {
                        return (IntPtr)1;
                    }
                }
                else if (wParam == (IntPtr)WM_KEYUP)
                {
                    int vkCode = Marshal.ReadInt32(lParam);
                    bool handled = false;
                    OnKeyUp((Keys)vkCode, ref handled);
                    if (handled)
                    {
                        return (IntPtr)1;
                    }
                }
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }

        public abstract void OnKeyDown(Keys key, ref bool handled);
        public abstract void OnKeyUp(Keys key, ref bool handled);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook,
            LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", SetLastError = true)]
        private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
            IntPtr wParam, IntPtr lParam);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);

        [DllImport("kernel32.dll")]
        private static extern uint GetCurrentProcessId();
    }

    public class KbListener : KeyboardCallback
    {
        public override void OnKeyDown(Keys key, ref bool handled)
        {
            Input.ChangeState(key, true);
            handled = true;
        }

        public override void OnKeyUp(Keys key, ref bool handled)
        {
            Input.ChangeState(key, false);
            handled = true;
        }
    }

}

Posts: 1

Participants: 1

Read full topic

Trim.Brep(Plane,Tolerance ) vs Trim.Brep(Brep,Tolerance )

$
0
0

@onrender wrote:

Hi there,

I would like to use the Trim.Brep method in Iron Python, however I selected the Brep surface as cutter, Rhino still expect the Plane.

import Rhino
import rhinoscriptsyntax as rs

objBrep = rs.GetObject ( "SelectBrep", 0, False, False, None, True)
cut = rs.GetObject ( "Select cutter", 0, False, False, None, False)

cut = rs.coercerhinoobject(cut)

print objBrep.Brep().Trim(cut,0.01)

Posts: 1

Participants: 1

Read full topic

Draw dynamically rectangle using editpythonscript

$
0
0

@Tom_Holt wrote:

Hi,

I am new to editpythonscript.

I would like to ask if someone could help me to write a code how to draw a simple rectangle3d dynamically using editpythonscript?

I would like to replicate the command rectangle using 3 points.
This command dynamically draws rectangle while adding points.

Posts: 2

Participants: 2

Read full topic


Serializing Rhino geometry outside the context of File read/write calls

$
0
0

@sarg wrote:

Hi all,

Is there any way to create a new instance of a BinaryArchiveWriter (/Reader), outside the context of Rhino file read/write operations? I want to serialize various GeometryBase objects directly to a byte array or memory stream.

Cheers,

Jon

Posts: 2

Participants: 2

Read full topic

Disable Gumball

$
0
0

@jeremy.graham wrote:

Hi,

Is there a way to disable the the gumball during on rhinoObject selectet by either turning off the gumball function or disabling the default gumball conduit programmatically?

cheers,
Jeremy

Posts: 1

Participants: 1

Read full topic

Unexpected result from Brep.GetBoundingBox(Plane plane) of text geometry

$
0
0

@thomas.gust wrote:

Hello everyone,

I have used Brep.GetBoundingBox(Plane plane) before. However, when I use it on a brep created from a text entity, it fails me:

from Rhino import *
from Rhino.DocObjects import *
from Rhino.Geometry import *

doc = RhinoDoc.ActiveDoc
doc.Objects.Clear()

text = "T"
style = DimensionStyle()
plane = Plane(Point3d(-2.0, 0.0, 1.0), Point3d(-1.0, 1.0, 1.0), Point3d(-2.0, 0.0, 2.0))

entity = TextEntity.CreateWithRichText(text, plane, style, False, 10.0, 0.0)

brep = entity.CreatePolySurfaces(style, 0.5)[0]
bbox = Box(brep.GetBoundingBox(plane))

doc.Objects.AddBrep(brep)
doc.Objects.AddBox(bbox)

doc.Views.Redraw()

In the code above I create some text aligned to a plane in space. When I try to get the plane-aligned bounding box of this text, things go wrong. What I get in fact, is the bounding box of the text as if it were created in Plane.WorldXY. Here is an example picture:

I do not understand how I get this result. Am I missing something, or is it a bug?

Greeting from Berlin,
Thomas

Posts: 3

Participants: 2

Read full topic

Filtering Point Clouds?

$
0
0

@ChristopherBotha wrote:

Hey All,

I am generating points by overhang value, result is a variably sized List and I now want to “sort” the points in that list, spacing them evenly to each other.


Any pointers to an algorithm for this?

Many thanks! CB

Posts: 1

Participants: 1

Read full topic

General information about "scriptcontext"

$
0
0

@luciano.micchini wrote:

Hello!
I wonder if somebody could give me some general information about the scriptcontext module.
particularly I didn’t understand what is the difference in using (for example) a function like
scriptcontext.doc.Objects.AddText(…) and the other one rhinoscriptsyntax.AddText(…).
I noticed that scriptcontext.doc.Objects methods are a subset of rhinoscriptsyntax functions. But I am not able to figure out what exactly is the purpose of scriptcontext module.
Thank you very much

Posts: 2

Participants: 2

Read full topic

Viewing all 8634 articles
Browse latest View live