Change basic object properies from "bylayer" to corresponding layer properties.

Change basic object properies from "bylayer" to corresponding layer properties.

GeryKnee
Advocate Advocate
793 Views
10 Replies
Message 1 of 11

Change basic object properies from "bylayer" to corresponding layer properties.

GeryKnee
Advocate
Advocate

 

Lisp Code :::

 

in current (active) selection,

for every item of selection,

Let ItemLayer=Item.layer

if(Item.color="Bylayer" -> Set Item.Color to ItemLayer.Color

If Item.LineType="Bylayer" -> Set LineType to ItemLayer.LineType

 

Thanks,

Gery

0 Likes
Accepted solutions (2)
794 Views
10 Replies
Replies (10)
Message 2 of 11

ВeekeeCZ
Consultant
Consultant
Accepted solution

This is what I use.

 

(vl-load-com)
(defun c:SetByLayerReverse (/ *error* adoc layer obj en ss i )
  
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ))
  
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (setq ss (ssget))
    (repeat (setq i (sslength ss))
      (setq en (ssname ss (setq i (1- i)))
	    obj (vlax-ename->vla-object en)
	    layer (vla-get-layer obj))
      
      (if (not (assoc 62 (entget en)))
	(vla-put-color obj (cdr (assoc 62 (tblsearch "layer" layer)))))
      
      (if (not (assoc 6 (entget en)))
	(vla-put-linetype obj (cdr (assoc 6 (tblsearch "layer" layer)))))
      
      (if (not (assoc 370 (entget en)))
	(vla-put-lineweight obj (cond ((cdr (assoc 370 (entget (tblobjname "layer" layer)))))
				      (-3))))))
  (vla-endundomark adoc)
  (princ)
  )
Message 3 of 11

dbroad
Mentor
Mentor
Accepted solution

First, I think the idea is lousy.  Using bylayer properties is far better and more manageable than assigning individual properties to objects themselves. That said, this is the most direct coding for your vba psuedo code.

 

 

;;Change selected object properties to object layer's properties.
(defun c:foo ( / doc lays lay prop);D.C.Broad,Jr.
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq lays (vla-get-layers doc))
  (if (ssget)
    (vlax-for n	(vla-get-activeselectionset doc)
      (setq lay (vla-item lays (vla-get-layer n)))
      (foreach prop '(color linetype)	;plotstyle, transparency, etc.
	(if (= acbylayer (vlax-get n prop))
	  (vlax-put n prop (vlax-get lay prop))
	  )
	)
      )
    )
  (princ)
  )

  

 

 

 

Architect, Registered NC, VA, SC, & GA.
Message 4 of 11

GeryKnee
Advocate
Advocate

Yes Sir,

Thank you very much.

Regards,

Gery.

0 Likes
Message 5 of 11

GeryKnee
Advocate
Advocate

That's working too

Thank you,

Gery

0 Likes
Message 6 of 11

GeryKnee
Advocate
Advocate

Is this ok for ByBlock plus to Bylayer ???

;;Change selected object properties to object layer's properties.
(defun c:foo ( / doc lays lay prop);D.C.Broad,Jr.
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq lays (vla-get-layers doc))
(if (ssget)
(vlax-for n (vla-get-activeselectionset doc)
(setq lay (vla-item lays (vla-get-layer n)))
(foreach prop '(color linetype) ;plotstyle, transparency, etc.
(if (= acbylayer (vlax-get n prop))
(vlax-put n prop (vlax-get lay prop))
)
)
(if (= acbyblock (vlax-get n prop))
(vlax-put n prop (vlax-get lay prop))
)
)
)
)
(princ)
)

0 Likes
Message 7 of 11

dbroad
Mentor
Mentor

You're welcome.

In addition, in rare cases, the property might not be applicable to the object. To accommodate those cases, the code within the foreach should be modified to be:

 

 

 

(if (and (vlax-property-available-p n prop)(= acbylayer (vlax-get n prop)))
	  (vlax-put n prop (vlax-get lay prop))
	  )

 

 

 

 

Architect, Registered NC, VA, SC, & GA.
0 Likes
Message 8 of 11

dbroad
Mentor
Mentor

To accomodate bylayer and byblock, I would recommend:

 

 

(defun c:foo  ()
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq lays (vla-get-layers doc))
  (if (ssget)
    (vlax-for n	 (vla-get-activeselectionset doc)
      (setq lay (vla-item lays (vla-get-layer n)))
      (foreach prop  '(color linetype)	;plotstyle, transparency, etc.
	(if (and (vlax-property-available-p n prop)
		 (member (vlax-get n prop) (list acbylayer acbyblock))
		 (vlax-put n prop (vlax-get lay prop)))))))
  (princ))

 

 

IMO, only the byblock properties should be assigned to layer properties.

Architect, Registered NC, VA, SC, & GA.
0 Likes
Message 9 of 11

GeryKnee
Advocate
Advocate

Yes,

That's very good.

Can after routine execution, selected objecs remain selected???

0 Likes
Message 10 of 11

dbroad
Mentor
Mentor

Actually, due to quirks in AutoCAD's implementation of bylayer and byblock, only this will probably work:

 

(defun c:foo  ( / doc lays lay ss prop)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq lays (vla-get-layers doc))
  (if (setq ss (ssget))
    (vlax-for n	 (vla-get-activeselectionset doc)
      (setq lay (vla-item lays (vla-get-layer n)))
      (foreach prop  '(color linetype)	;plotstyle, transparency, etc.
	(if (and (vlax-property-available-p n prop)
		 (member (vlax-get n prop)
			 (list acbylayer acbyblock "ByLayer" "Byblock")))
	  (vlax-put n prop (vlax-get lay prop))))))
  (sssetfirst nil ss)
  (princ))

 

Architect, Registered NC, VA, SC, & GA.
0 Likes
Message 11 of 11

GeryKnee
Advocate
Advocate

Yes,

Thats not working.

Theres a need here,

 

I resend :

Lisp Code :::

 

in current (active) selection,

for every item of selection,

Let ItemLayer=Item.layer

About Item properties:

Set  Item.layer = ActiveLayer

Set  Item.Color = AcBylayer

The Other properies LineType etc 

If Item.LineType="Bylayer" or "Byblock" -> Set LineType to ItemLayer.LineType

.......

 

 

0 Likes