Jump to content

How to get Region coordinates?


Johntosh

Recommended Posts

Considering that it couldn't be done - without knowing what all that coding is after using (entget(car(entsel))) - I needed a work-around...

 

...I collected my regions into a selection set and exploded them leaving the resultant lines. I then acquired the lines into another selection set and then return all the coordinates. Now this was achievable (to my knowledge) if there were no other lines in the drawing as I used the "_X" method. Yet if there had been, was there a way for me to collect all the component parts of the exploded region? All the regions have varying line counts.

Link to comment
Share on other sites

These are two ways I would approach it:

 

in VL:

 

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:test  [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] Reg RetObj RetEnt[b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] Reg [b][color=RED]([/color][/b][b][color=BLUE]vlax-ename->vla-object[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entsel[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] RetObj [b][color=RED]([/color][/b][b][color=BLUE]vlax-safearray->list[/color][/b]
                [b][color=RED]([/color][/b][b][color=BLUE]vlax-variant-value[/color][/b]
                  [b][color=RED]([/color][/b][b][color=BLUE]vla-explode[/color][/b] Reg[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]alert[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-princ-to-string[/color][/b] RetObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [i][color=#990099]; Convert to Ename?[/color][/i]

 [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] RetEnt [b][color=RED]([/color][/b][b][color=BLUE]mapcar[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=BLUE]vlax-vla-object->ename[/color][/b] RetObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]alert[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-princ-to-string[/color][/b] RetEnt[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

In Common:

 

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:test  [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] Reg RetEnts[b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] Reg [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entsel[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]command[/color][/b] [b][color=#ff00ff]"_explode"[/color][/b] Reg[b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] RetEnts [b][color=RED]([/color][/b]Ent_List_to_End Reg[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]alert[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-princ-to-string[/color][/b] RetEnts[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] Ent_List_to_End  [b][color=RED]([/color][/b]ent [b][color=BLUE]/[/color][/b] a[b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]reverse[/color][/b]
   [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] a [b][color=RED]([/color][/b][b][color=BLUE]entnext[/color][/b] ent[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
     [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] ent [b][color=RED]([/color][/b]Ent_List_to_End a[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 

I personally prefer the VL method, it seems more reliable.

Link to comment
Share on other sites

Yes.

 

I would still be inclined to use Visual LISP for this task though.

 

The explode method in VL automatically returns the components in an array, so you needn't use a sub-function to scour the database.

Link to comment
Share on other sites

May need to check if the "explode" returned more regions. If the original was a composite, or had islands, a second explode may be in order.

Link to comment
Share on other sites

May need to check if the "explode" returned more regions. If the original was a composite, or had islands, a second explode may be in order.

 

I thought a region only exploded into Lines, Arcs and Splines? What instances do you speak of?

Link to comment
Share on other sites

Good point, OK, perhaps this then:

 

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:test  [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] Reg RetObj[b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] Reg [b][color=RED]([/color][/b][b][color=BLUE]vlax-ename->vla-object[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entsel[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] RetObj [b][color=RED]([/color][/b][b][color=BLUE]vlax-safearray->list[/color][/b]
                [b][color=RED]([/color][/b][b][color=BLUE]vlax-variant-value[/color][/b]
                  [b][color=RED]([/color][/b][b][color=BLUE]vla-explode[/color][/b] Reg[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]repeat[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]length[/color][/b] RetObj[b][color=RED])[/color][/b]
   [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=#ff00ff]"AcDbRegion"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-get-ObjectName[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] RetObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
     [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] RetObj [b][color=RED]([/color][/b][b][color=BLUE]append[/color][/b] RetObj [b][color=RED]([/color][/b][b][color=BLUE]vlax-safearray->list[/color][/b]
                                   [b][color=RED]([/color][/b][b][color=BLUE]vlax-variant-value[/color][/b]
                                     [b][color=RED]([/color][/b][b][color=BLUE]vla-explode[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] RetObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
     [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] RetObj [b][color=RED]([/color][/b][b][color=BLUE]append[/color][/b] RetObj [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] RetObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
   [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] RetObj [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] RetObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
 
 [b][color=RED]([/color][/b][b][color=BLUE]alert[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-princ-to-string[/color][/b] RetObj[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

Link to comment
Share on other sites

  • 5 years later...

Respected sir, I want to ask you that whether we can get the center and radius of a circle by just one click on rectangle of the block of drawing shown by SEANT. Please help me, sir.

Link to comment
Share on other sites

magan, use (setq parentbl (tblobjname "BLOCK" "Your block name")) to get parent block ename... Then use (setq nent (entnext parentbl)) to get 1st nested ename of parent, and iterate through all of them with (while (setq nent (entnext nent)) ... ). For each nent, you should check DXF 0 - if it's "CIRCLE" then you can get center with DXF 10, and its radius with DXF 40...

Link to comment
Share on other sites

sir, its not working. please help me little bit more in this regard so that i can reach to my final destination of work. Error msg: bad argument.

Please help me sir......

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...