Visual LISP, AutoLISP and General Customization
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Selecting objects by Linetype, If statment

6 REPLIES 6
SOLVED
Reply
Message 1 of 7
RockyBrown4134
3936 Views, 6 Replies

Selecting objects by Linetype, If statment

Ok....I have created this "simple" routine to help clean up legacy blosks to meet new company standards.

 

It selectect objects by linetype and changes them to the correct layer, color and linetype settings.

It appears that if the linetype is not in the file I get crazy results. This is the fourth version after reading through some post on the discussion group. Am I over looking something simple?

 

I have attache the code and ample dwg.

 

All suggestions welcome and appreciated!

 

Thanks

 

Here is the code:

;
;This programs cleans up an existing legacy block by:
;    Changing hidden linetype lines to layer 0
;   Changing continuous linetype lines to layer 0
;   Changing bylayer linetype lines to layer 0
;   changes color to byblock
;   changes continuous and bylayer linetypes to byblock.
;This sets up blocks to be used with any color, linetype, on any layer for our company standards.
;
(DEFUN C:blkcln ()
(setvar "cmdecho" 1)
   (setq olderr *error*
         *error* CHGTERR)
  (if (tblsearch "ltype" "hidden")
                (progn
    (command "._chprop" (ssget "X" '((6 . "HIDDEN"))) "" "C" "byblock" "LT" "hidden" "la" "0" "")
   );end progn
  );end if
;
  (if (tblsearch "ltype" "continuous")
                (progn
    (command "._chprop" (ssget "X" '((6 . "continuous"))) "" "C" "byblock" "LT" "continuous" "la" "0" "")
    );end progn
  );end if
;
  (if (tblsearch "ltype" "ByLayer")
   (progn
    (command "._chprop" (ssget "X" '((6 . "ByLayer"))) "" "C" "byblock" "LT" "ByLayer" "la" "0" "")
   );end progn
  );end if
;
(COMMAND "-PURGE" "ALL" "" "N")
(COMMAND "REGEN")
;
);END DEFUN

 

 

Here is the Crazy Error I get:

Command: BLKCLN ._change Select objects:   5 found

Select objects: Specify change point or [Properties]: P Enter property to change [Color/Elev/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: C New color [Truecolor/COlorbook] <BYLAYER>: byblock Enter property to change [Color/Elev/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: LT Enter new linetype name <HIDDEN>: hidden Enter property to change [Color/Elev/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: la Enter new layer name <ALCO>: 0 Enter property to change [Color/Elev/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: Command: ._chprop Select objects:   5 found

Select objects: Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: C New color [Truecolor/COlorbook] <BYBLOCK>: byblock Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: LT Enter new linetype name <HIDDEN>: hidden Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: la Enter new layer name <0>: 0 Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: Command: ._chprop Select objects: Command: BLKCLN Unknown command "BLKCLN".  Press F1 for help.

Command: C Unknown command "C".  Press F1 for help.

Command: byblock Unknown command "BYBLOCK".  Press F1 for help.

Command: LT Unknown command "LT".  Press F1 for help.

Command: continuous Unknown command "CONTINUOUS".  Press F1 for help.

Command: la Unknown command "LA".  Press F1 for help.

Command: 0 Unknown command "0".  Press F1 for help.

Command: BLKCLN Unknown command "BLKCLN".  Press F1 for help.

Command: ._chprop Select objects:   51 found

Select objects: Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: C New color [Truecolor/COlorbook] <BYLAYER>: byblock Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: LT Enter new linetype name <ByLayer>: ByLayer Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: la Enter new layer name <ALCO>: 0 Enter property to change [Color/LAyer/LType/ltScale/LWeight/Thickness/Material/Annotative]: Command: -PURGE Enter type of unused objects to purge [Blocks/Dimstyles/LAyers/LTypes/MAterials/Plotstyles/SHapes/textSTyles/Mlinestyl es/Tablestyles/Visualstyles/Regapps/All]: ALL Enter name(s) to purge <*>: Verify each name to be purged? [Yes/No] <Y>: N No unreferenced blocks found.

No unreferenced layers found.

No unreferenced linetypes found.

No unreferenced text styles found.

No unreferenced shape files found.

No unreferenced dimension styles found.

No unreferenced mlinestyles found.

No unreferenced plotstyles found.

No unreferenced table styles found.

No unreferenced materials found.

No unreferenced visual styles found.

Command: REGEN Regenerating model.

Command: nil

 

If this response answers your question, Please mark this response as "Accept as Solution"

Rocky Brown
AutoCAD 2020 / Inventor 2020 / Plant 3D
6 REPLIES 6
Message 2 of 7

That's probably a result of (ssget) not finding anything with a particular linetype assigned.  When it returns nil, the CHPROP command ends, and the "" [Enter] that should be completing the object selection for it becomes a Return that recalls the last command, but within a (command) function that always has a problem with (defun)'d rather than native AutoCAD commands.

 

Without loading it up and trying it, I have a few suggestions.

 

You should not need to check whether the linetypes are loaded [besides which, there's never a need to check for Continuous, because you can't purge it, and Bylayer isn't a linetype that can be "loaded," nor does it show up in a (tblsearch)].  If any objects have them assigned, they will be in the drawing.  But you can avoid the problem by having it only proceed to make the changes you want if it finds any objects with a given linetype assigned.

 

Also, if anything is of ByLayer linetype, it won't be found by searching for that in a code-6 entry -- the object's entity data simply will not have a code-6 entry.  That means (ssget "X" '((6 . "ByLayer"))) will never find anything.  I'd have to think about whether there's any way to use (ssget) to find things that don't have a particular code, other than selecting everything and stepping through to check each one.

 

And by the way, you don't need those (progn) functions, when the 'then' arguments to your (if) tests are just single (command) functions.  The (progn) is needed only if you need to combine multiple functions into one 'then' or 'else' argument.

 

Try something like this [untested] at least for the non-Bylayer categories:

 

(DEFUN C:blkcln ()
;.... your preliminaries ....

  (if (setq ss (ssget "X" '((6 . "HIDDEN")))); only if it finds some
    (command "._chprop" ss "" "C" "byblock" "la" "0" ""); I took out the linrtype assignments, since they already are
  );end if
;
  (if (setq ss (ssget "X" '((6 . "continuous"))))
    (command "._chprop" ss "" "C" "byblock" "la" "0" "")
  );end if
;
; .... your closeout stuff ....

);END DEFUN

 

And of course, those will only work with things that have those linetypes assigned as entitty overrides, not any that inherit them from their Layers.

Kent Cooper, AIA
Message 3 of 7

Thanks Kent. That works sweet.

 

It was even simplier that what I was trying to make it.

 

Ok, i'll keep looking to see what to do for objects that are set for Bylayer.

 

The (Progn were in the cod wen I had it broken out into multiple steps. I just did'nt take them out.

 

Thanks again. I'm a lot closer than I was.

If this response answers your question, Please mark this response as "Accept as Solution"

Rocky Brown
AutoCAD 2020 / Inventor 2020 / Plant 3D
Message 4 of 7
scot-65
in reply to: RockyBrown4134

>> Ok, i'll keep looking to see what to do for objects that are set for Bylayer....

 

(tblsearch "LAYER" "MyLayer") will display the dfx codes for that particular layer.

DXF 62 will be color, DXF 6 is linetype.

 

(cdr (assoc 6 (tblsearch "LAYER" "MyLayer"))) is one method to what you are looking for.

 

-OR- look into looping a TBLNEXT to ensure all layers are accounted for...

 

Watch out for xref layers "*|*".

 

Another thought - Don't move bylayer objects to another layer, use -RENAME instead.

 

???

 


Scot-65
A gift of extraordinary Common Sense does not require an Acronym Suffix to be added to my given name.


Message 5 of 7
Kent1Cooper
in reply to: scot-65


@scot-65 wrote:
.... 

(tblsearch "LAYER" "MyLayer") will display the dfx codes for that particular layer.

DXF 62 will be color, DXF 6 is linetype.

 

(cdr (assoc 6 (tblsearch "LAYER" "MyLayer"))) is one method to what you are looking for.

 

-OR- look into looping a TBLNEXT to ensure all layers are accounted for...

....


I suspect you've misunderstood what they're trying to do.  It's not about the characteristics of Layers.  They're trying to find [with (ssget) if possible, but I'm not sure it is] all objects whose assigned linetype is "Bylayer," or perhaps I should say whose lack of an assigned linetype makes them Bylayer.  See my paragraph above beginning with "Also" for why I'm not sure you can do that, at least not directly -- you can filter in (ssget) for an entity data entry with a particular associated value, but is it possible to filter for an entry not being there at all?

Kent Cooper, AIA
Message 6 of 7
hmsilva
in reply to: RockyBrown4134

RockyBrown4134 wrote:

...

Ok, i'll keep looking to see what to do for objects that are set for Bylayer.

...

 

Just a different approach,

 

(defun c:test (/ ss vlaObj)
  (if (setq ss (ssget "_X"))
    (progn
      (setq ss (vla-get-activeselectionset
		 (vla-get-activedocument (vlax-get-acad-object))
	       )
      )
      (vlax-for	vlaObj ss
	(if (= (vla-get-Linetype vlaobj) "HIDDEN")
	  (progn
	    (vlax-put-property vlaObj 'Layer "0")
	    (vla-put-color vlaObj 0)
	  );; progn
	);; if
	(if (= (vla-get-Linetype vlaobj) "CONTINUOUS")
	  (progn
	    (vlax-put-property vlaObj 'Layer "0")
	    (vla-put-color vlaObj 0)
	  );; progn
	);; if
	(if (= (vla-get-Linetype vlaobj) "BYLAYER")
	  (progn
	    (vlax-put-property vlaObj 'Layer "0")
	    (vla-put-color vlaObj 0)
	  );; progn
	);; if
	(vlax-release-object vlaObj)
      );; vlax-for
    );; progn
  );; if
  (princ)
);; test

 hope that helps
Henrique

EESignature

Message 7 of 7
cschnarr
in reply to: Kent1Cooper

Thanks @Kent1Cooper  for providing me the code method needed to select objects by a specific linetype! You helped me today to write the code I needed. I import drawing from another CAD software. The entities are all on layer 0 and have assigned linetypes, lineweights and colors. It is a fixed list of 7 different linetypes always named the same way. Now I can select each linetype one at a time and place the geometry on the correct layer, with linetype, color, and lineweight all set to bylayer. Thanks for answering the original question and teaching all of us.

 

I would like to learn how to use all of the features of QUICKSELECT in lisp routines. It is really the answer to making a selection set of the specific items you want.

 

Good post! Great stuff!!

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report

”Boost