goal: Let the user write python to easily make geometry entites with entity names that the programmer can reference why: In conventional CAD programs, the user clicks around to draw lines, edges, and other geometry. To reference an object, they can click. In a CAD API, you have to have an identifier. How this identifier works defines how easy it is for the user to continue with his work, and there are several ways to do this, some more elegant than others. example: (please assume there's no Square() or Parallelepiped() for the purposes of this example) Figure 1: rectangle ABCD or "sq1" b B-------------------------C | | | | a | | c | | | | A-------------------------D d def make_base(...): #defining the points A = Point(0,0) B = Point(0,2) C = Point(4,2) D = Point(4,0) #defining the lines a = Line(A,B) b = Line(B,C) c = Line(C,D) d = Line(D,A) #connecting everything together sq1 = Polyline(a,b,c,d) #some additional ways to do the same thing sq1 = Polyline((A,B), (B,C), (C,D), (D,A)) sq1 = a.union(b).union(c).union(d) return sq1 .. somewhere in the script ... sq2 = make_base() Now, the user wants to double the length of edge b or reposition point B. How should he do this? You can't assume that A, B, C, D, a, b, c, d are in the local scope that the user is writing code in. Maybe BasePlate is a class (in which case, it could have BasePlate.A, .B, etc.); maybe a function returned the geometry from somewhere else; for a variety of reasons, you can't assume that the original python variables were defined in the local scope. So, given sq2 (as above), what's the best, most intuitive way, to let the user update B? sympy's method is as follows: B = Point("B", 0, 2) .. stuff happens .. sq1["B"] #returns it by the named reference .. but that makes saying B= kinda redundant. Why should there be both the name B and the name B for the same object? ignore the rest of this document :) ------------------------------------------------ There are two ways he might go about it: (1) the natural action to take would be to redefine b to be b=2*b or at least say B = B.y * 2 ^ this is fine & i like this :) (2) sq1.edges[1] = sq1.edges[1] * 2 note that the user wouldn't just say "b" here because "b" might have been defined in another local scope (not the current one) (1) The user carries on, extrudes sq1, draws a sketch on one of the surfaces, etc., and soon enough he has his T-16 skyhopper and is bullseying womp rats back home. Eventually, his object is called, say, skyhopper: skyhopper = Skyhopper() #he even made an object! the force is truly with our user Now, given the "skyhopper" variable, how would the user update the original position of point B?