Jump to content

Recommended Posts

Posted

I need a lisp routine to put all xrefs in a drawing onto the layer "G-XREF". Where;

If the layer does not exist it would be created first?

 

:?:?:?

:unsure::unsure::unsure:

  • Replies 25
  • Created
  • Last Reply

Top Posters In This Topic

  • pBe

    10

  • BlackBox

    5

  • Tharwat

    4

  • Lee Mac

    3

Top Posters In This Topic

Posted (edited)
(defun c:XRL (/ objs ent i)
(setq objs (ssget "_X" '((0 . "INSERT")[color=blue](8 . "~G-XREF")[/color])))
(repeat (setq i (sslength objs))
       (setq ent (entget (ssname objs (setq i (1- i)))))
            (if [color=blue](and[/color] (= 4 (logand 4 (cdr (assoc 70 (tblsearch "BLOCK" (cdr (assoc 2 ent)))))))
      [color=blue](= (cdr (assoc 70 (entget (tblobjname "LAYER" (cdr (assoc 8 ent)))))) 0))[/color]
 
    (entmod (subst (cons 8 "G-XREF")(assoc 8 ent) ent))))
)

Edited by pBe
Add layer locked cond
Posted

If the layer does not exist it would be created first?

:

 

You may need also to add some more codes for adding the layer name to the layer Name list pBe. :)

Posted
You may need also to add some more codes for adding the layer name to the layer Name list pBe. :)

 

No tharwat, entmod does that for you.

if the layer does not exist it will create the layer on the fly

 

What should be added is a filter excluding INSERTS/XREF already on layer G-XREF

 

(setq objs (ssget "_X" '((0 . "INSERT")[color=blue](8 . "~G-XREF")[/color])))

Posted
You're right pBe .

 

I am sorry for the confusion .

 

No worries Tharwat. and again no need to apologize my friend.

 

Cheers

Posted
(defun c:XRL (/ objs ent i)
(setq objs (ssget "_X" '((0 . "INSERT"))))
(repeat (setq i (sslength objs))
       (setq ent (entget (ssname objs (setq i (1- i)))))
            (if (= 4 (logand 4 (cdr (assoc 70 (tblsearch "BLOCK" (cdr (assoc 2 ent)))))))
    (entmod (subst (cons 8 "G-XREF")(assoc 8 ent) ent))))
)

 

What should be added is a filter excluding INSERTS/XREF already on layer G-XREF

 

(setq objs (ssget "_X" '((0 . "INSERT")[color=blue](8 . "~G-XREF")[/color])))

 

Nice one pBe; just be sure to watch for XREF's on locked layers :wink:

Posted
Nice one pBe; just be sure to watch for XREF's on locked layers :wink:

 

Thanks Renderman. :)

Your are right

 

Post updated

Posted

Building on your code, and just for fun:

 

(defun c:XRL2 ( / ss l)
 (if (setq ss (ssget "_x" (list '(0 . "INSERT")
                                (cons 8 (strcat "~" (setq l "G-XREF"))))))
   ((lambda (i / e n)
      (while (setq e (entget (ssname ss (setq i (1+ i)))))
        (if (and (= 4 (logand 4 (cdr (assoc 70 (tblsearch "block" (cdr (assoc 2 e)))))))
                 (= 0 (cdr (assoc 70 (entget (tblobjname "layer" (cdr (setq n (assoc 8 e)))))))))
          (entmod (subst (cons 8 l) n e)))))
     -1)
   (prompt "\n** Nothing selected ** "))
 (princ))

 

(defun c:XRL3 ( / dxf ss l)

 (defun dxf (n eData)
   (if (and (= 'INT (type n)) (listp eData))
     (cdr (assoc n eData))
     (prompt "\n** \"DXF\" error: Invalid argument ** ")))
 
 (if (setq ss (ssget "_x" (list '(0 . "INSERT")
                                (cons 8 (strcat "~" (setq l "G-XREF"))))))
   ((lambda (i / e)
      (while (setq e (entget (ssname ss (setq i (1+ i)))))
        (if
          (and
            (= 4 (logand 4 (dxf 70 (tblsearch "block" (dxf 2 e)))))
            (= 0 (dxf 70 (entget (tblobjname "layer" (dxf 8 e))))))
           (entmod (subst (cons 8 l) (assoc 8 e) e)))))
     -1)
   (prompt "\n** Nothing selected ** "))
 (princ))

Posted

Great stuff Renderman.

 

Question for you.

Can you use both "_X" and ":L" method of selection for ssget together in one syntax? perhaps on newer version?

Posted
Great stuff Renderman.

 

Cheers! :beer:

 

Question for you.

Can you use both "_X" and ":L" method of selection for ssget together in one syntax? perhaps on newer version?

 

Tharwat has already shown you another great example, courtesy of Lee. :wink:

 

To add a bit more to the explanation, here's some additional documentation on SSGET:

 

 

X Extended search (search whole database)

 

Entire database. If you specify the X selection method and do not provide a

 

filter-list, ssget selects all entities in the database, including entities on

 

layers that are off, frozen, and out of the visible screen.

 

As the "X" option searches the entire drawing database, you must utilize the filter to limit the included entity pointers in the selection set, or you must conditionally filter out what you do not want from the returned selection set... hope that makes sense.

Posted

You might also want to consider using SSGET's "A" mode:

 

 

A All like "X" but filters frozen out

 

Selects all objects on thawed layers.

Posted

My version:

 

(defun c:xrlayer ( / a b c d layer )
   
   (setq layer "G-XREF")

   (while (setq a (tblnext "BLOCK" (null a)))
       (if (= 4 (logand 4 (cdr (assoc 70 a))))
           (setq b (cons "," (cons (cdr (assoc 2 a)) b)))
       )
   )
   (if (setq c
           (ssget "_X"
               (list
                   (cons 0 "INSERT")
                   (cons 2 (apply 'strcat (cdr b)))
                   (cons 8 (strcat "~" layer))
               )
           )
       )
       (repeat (setq d (sslength c))
           (entmod (list (cons -1 (ssname c (setq d (1- d)))) (cons 8 layer)))
       )
   )
   (princ)
)

Posted

Interesting approach Lee, collecting locked layer names and using that for exclusion filter

 

Clever :)

Posted

 

To add a bit more to the explanation, here's some additional documentation on SSGET:

 

As the "X" option searches the entire drawing database, you must utilize the filter to limit the included entity pointers in the selection set, or you must conditionally filter out what you do not want from the returned selection set... hope that makes sense.

 

 

Thanks for the info Renderman.

 

:beer:

Posted
Interesting approach Lee, collecting locked layer names and using that for exclusion filter

 

Clever :)

 

Thanks pBe, I assume you are referring to my example at theSwamp ;)

Posted

Yup.. your new code here used a different approach. Block names.

 

Nice :)

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...