matteoluigi Posted March 12, 2021 Share Posted March 12, 2021 Hi, we still are working again on Secondlevel Space Boundaries for Space Objects. ( However I think about solving the issue with a Python-script. In Worksheets there exists the function GetSpaceNameForObj and GetSpaceNumForObj. I have been looking for it in the Vectorscript/Python function reference, without any success... Quote SpaceName = vs.GetSpaceNameForObj(HNDL) SpaceNum = vs.GetSpaceNumForObj(HNDL) obviously don't exist. Guess the commands only exist for Worksheets, right? Is there any possibility to coordinate an object to the adjacent space object? Quote Link to comment
MullinRJ Posted March 13, 2021 Share Posted March 13, 2021 @matteoluigi , Have you tried querying the PIO record for the name and number? SpaceName = vs.GetRField(vs.FSActLayer(), 'Space', 'Name') SpaceNum = int(vs.GetRField(vs.FSActLayer(), 'Space', 'Number')) And if you need it, SpaceArea = vs.Str2Num(vs.GetRField(vs.FSActLayer(), 'Space', 'Area')) HTH, Raymond Quote Link to comment
matteoluigi Posted March 13, 2021 Author Share Posted March 13, 2021 8 hours ago, MullinRJ said: SpaceName = vs.GetRField(vs.FSActLayer(), 'Space', 'Name') SpaceNum = int(vs.GetRField(vs.FSActLayer(), 'Space', 'Number')) nope, sorry but both worksheet functions don't check the name or number of a selected space but they get me the name or number of a space the selected object is situated in. For example GetSpaceNameForObj can get me Name and Number of the space-object a selected furniture-symbol is planned in. Pity, that the function obviously only works in worksheets, not in Vectorsript/Python Quote Link to comment
MullinRJ Posted March 14, 2021 Share Posted March 14, 2021 @matteoluigi , Sorry, I misunderstood the question and the nature of the WS functions. Here is a short Pascal script, lightly tested, that searches every Space object in the drawing and tests if the object passed to the function is inside any Space. Now the functions I posted earlier will return the correct results AFTER the new function is called which returns the appropriate Space handle. It shouldn't be too hard to Pythonize the script. As a simplification, I am using the center point of the referenced object to make the test, and not testing the object's bounding box. Feel free to modify this to your heart's content. PROCEDURE xxx; { Script to test the ObjInSpace function. } { 14 Mar 2021 - Raymond Mullin } VAR H0, SpaceH :Handle; SpaceNum :Integer; SpaceName :String; function ObjInSpace(H :Handle) :Handle; { Return a handle to the Space object that contaons object H, or NIL if none is found. } { 14 Mar 2021 - Raymond Mullin } Var SpaceH :Handle; X, Y :Real; procedure InSpace(SpcH :Handle); Var RecH, PolyH :Handle; Begin RecH := GetParametricRecord(SpcH); if (RecH <> nil) & (GetName(RecH) = 'Space') then begin PolyH := Space_GetGrossPoly(SpcH); if PtInPoly(X, Y, PolyH) then SpaceH := SpcH; end; { if } End; { InSpace } Begin { ObjInSpace } hCenter(H, X, Y); SpaceH := nil; ForEachObject(InSpace, T=86); ObjInSpace := SpaceH; End; { ObjInSpace } BEGIN H0 := FSActLayer; SpaceH := ObjInSpace(H0); if (SpaceH <> nil) then begin SpaceName := GetRField(SpaceH, 'Space', 'Name'); SpaceNum := Str2Num(GetRField(SpaceH, 'Space', 'Number')); message(SpaceName, ' ', SpaceNum); end { if } else message('Selected object is not contained in any Space objects in the drawing.'); SysBeep; END; Run(xxx); HTH, Raymond 2 Quote Link to comment
matteoluigi Posted March 19, 2021 Author Share Posted March 19, 2021 (edited) Quote def ObjInSpace(SpaceH): def InSpace(SpcH): RecH = vs.GetParametricRecord(SpcH) RecHN = vs.GetName(RecH) if ((RecH != '') & (RechN == 'Space')): PolyH = vs.Space_GetGrossPoly(SpcH) if vs.PtInPoly(X, Y, PolyH): SpaceH = SpcH X,Y=vs.HCenter(SpaceH) SpaceH = '' vs.ForEachObject(InSpace, 'T=86') ObjInSpace = SpaceH H0 = vs.FSActLayer() SpaceH = ObjInSpace(H0) if (SpaceH != ''): SpaceName = vs.GetRField(SpaceH, 'Space', 'Name') SpaceNum = vs.Str2Num(vs.GetRField(SpaceH, 'Space', 'Number')) vs.AlrtDialog(vs.Concat(SpaceName, ' ', SpaceNum)) if (SpaceH == ''): vs.AlrtDialog('Selected object is not contained in any Space objects in the drawing.') I tried to pythonize it, but it won't work to the end 😉 what's wrong? The compiler says: Traceback (most recent call last): "File "<string>", line 11, in InSpace NameError: name 'Rechn' is not defined Edited March 19, 2021 by matteoluigi Quote Link to comment
Pat Stanford Posted March 19, 2021 Share Posted March 19, 2021 The variable in Raymonds script it RecH (Record Handle). If the error message actually says Rechn, then you have a typo or have changed the variable name. And Python cares about capitalization (IMNSHO a really stupid thing to do in a programming language.) The last line of your quote shows RecHN. The error message says Rechn. I believe those would be considered different variables. That is part of why I am sticking to Pascal as long (or longer) than possible. 2 Quote Link to comment
MullinRJ Posted March 19, 2021 Share Posted March 19, 2021 (edited) Hello @matteoluigi Pat's right, there is a typo. if ((RecH != '') & (RechN == 'Space')): should read: if ((RecH != '') & (RecHN == 'Space')): HTH, Raymond Edited March 19, 2021 by MullinRJ 1 Quote Link to comment
matteoluigi Posted March 22, 2021 Author Share Posted March 22, 2021 On 3/20/2021 at 12:08 AM, MullinRJ said: RecHN thanks for helping an old myopic man by correcting his simple syntax-errors 😉 However, I still don't understand various things and so I don't get to pythonize the code that easily : 1) I try to call the function "ObjInSpace" with the command "SpaceH = ObjInSpace(H0)". In my opinion I give over the Handle of the previously selected Object H0 = vs.FSActLayer() to the function that way. (that's what you intended to do) 2) however you start the function wit the command "function ObjInSpace(H :Handle) :Handle" is my variant right: def ObjInSpace(SpaceH):? Imo, SpaceH is the "key Handle" in the "ObjInSpace"-function, so, I chose "SpaceH" and not "H" as Handle however, the Handle "H" never gets mentioned in your whole code. Why? (and, however, your Code WORKS. I already tested it.) 3) if (SpaceH != ''): is the right correspondent code to if (SpaceH <> nil) then begin in Pascal, right? ('' of course are 2 single quotation marks 😉) then still I'm not 100% sure if the sequence of my code is ok that way, although it definitely is the same as in other Python scripts, where I called a "foreach"-function... It just feels a little strange first writing the function and then the main program. So you did with the foreach-"subfunction" in your code as well. It's like: def ObjInSpace(SpaceH): def InSpace(SpcH): def InSpace-Code def ObjInSpace-Code Main Code SpaceH = ObjInSpace(H0) right? Sorry for my complex questions, I don't have the time for controlling my code more accurately at work and at home, too. Quote Link to comment
matteoluigi Posted March 22, 2021 Author Share Posted March 22, 2021 ... I replaced "T='86' " with "PON='SPACE' "... so, only spaces are related, no more walls, slabs,... however, it wasn't enough... Quote Link to comment
MullinRJ Posted March 23, 2021 Share Posted March 23, 2021 @matteoluigi , Try this Python conversion. I used your PON='Space' suggestion for the criteria, since it simplifies the runtime. Also note that you have to declare SpaceH as a global variable, since it cannot be passed in the function's calling parameter list. This may be why it wasn't working for you. import vs # Script to test the ObjInSpace function. # 14 Mar 2021 - Raymond Mullin # GOLBALS NIL = vs.Handle() # constant for readability SpaceH = NIL # initialize variable def ObjInSpace(H1): # Return a handle to the Space object that contaons object H, or NIL if none is found. # 14 Mar 2021 - Raymond Mullin def InSpace(SpcH): global SpaceH RecH = vs.GetParametricRecord(SpcH) if (RecH != NIL): PolyH = vs.Space_GetGrossPoly(SpcH) if vs.PtInPoly(X, Y, PolyH): SpaceH = SpcH X, Y = vs.HCenter(H1) vs.ForEachObject(InSpace, "PON='Space'") return SpaceH H0 = vs.FSActLayer() SpaceH = ObjInSpace(H0) if (SpaceH != NIL): SpaceName = vs.GetRField(SpaceH, 'Space', 'Name') SpaceNum = int(vs.Str2Num(vs.GetRField(SpaceH, 'Space', 'Number'))) vs.Message(SpaceName, ' ', SpaceNum) else: vs.Message('Selected object is not contained in any Space objects in the drawing.') vs.SysBeep() HTH, Raymond 2 Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.