Code Red > AutoLISP (Vanilla / Visual)

LM:SentenceCase Use in routine

<< < (2/5) > >>

jlogan02:

--- Quote from: kdub on November 18, 2022, 05:01:11 PM ---Ahh, now I understand . . . You just want to add an 's' to a specific filter name.

. . . but you don't seem to be checking if the layerFilter you are renaming actually exists.

I assume you want to batch process drawings, or run this as part of a config routine, but you do realise that Right-click on the Filter name offers a rename option.

Regards,

added:

a piccy if 'Renamed' filter does not exist

--- End quote ---

I gotcha. My "if" statement should include a search for the filter name not the variable "layn".

I think I need to be looking at the extension directory for the layer filter name.

kdub_nz:
Perhaps something like :
(may not be bomb proof :)


--- Code - Auto/Visual Lisp: --- (defun c:DoTest (/ oldName newName extensionDict layerFilter)  (or *acdoc*      (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))  )  (setq oldName "frutier"        newName "Fruitiers"  )   (if (and        (setq extensionDict               (vla-getExtensionDictionary (vla-get-Layers *acdoc*))        )        (setq layerFilters               (kdub:safeitem extensionDict "ACAD_LAYERFILTERS")        )      )    (if (setq layerFilter (kdub:safeitem layerFilters newName))      (princ        (strcat "\n" (vla-get-Name layerFilter) " already exists.")      )      ;;else      (if (setq layerFilter (kdub:safeitem layerFilters oldName))        (progn          ;;(vla-put-Name layerFilter newName)          (command "._-layer" "filter" "Rename" oldName newName "")          (princ "\nFilter name was changed.")        )        ;;else        (princ (strcat "\n" oldName " filter does not exists."))      )    )    ;;else     ;;   )   (princ))  ;;;-------------------------------------------------------------------- (defun kdub:safeitem (collection item / returnvalue)  (if (not (vl-catch-all-error-p             (setq returnvalue                    (vl-catch-all-apply                      'vla-item                      (list collection item)                    )             )           )      )    returnvalue  )) ;;;--------------------------------------------------------------------  

jlogan02:
Thanks kdub, I'll take a look at this. Is your safeitem routine a shortened method for getting at the filters collection by using vla-item?

kdub_nz:

--- Quote from: jlogan02 on November 21, 2022, 11:12:15 AM ---Thanks kdub, I'll take a look at this. Is your safeitem routine a shortened method for getting at the filters collection by using vla-item?

--- End quote ---

Hi,
It just a GuardClause function which either returns  the collection item (VLA-OBJECT) or nil

An optimised version is

--- Code - Auto/Visual Lisp: ---(defun GetSafeItem (collection item / vlaObj)  (vl-catch-all-apply    (function (lambda () (setq vlaObj (vla-item collection item ))))  )  vlaObj) 
Test this

--- Code - Auto/Visual Lisp: ---  (or *acdoc*      (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))  )(GetSafeItem (vla-get-layers *acdoc*) "0") (GetSafeItem (vla-get-layers *acdoc*) "NoSuchLayer") (vla-item (vla-get-layers *acdoc*) "NoSuchLayer") 
result:

--- Code: ---#<VLA-OBJECT IAcadLayer 0000021e6f957cd8>

nil

; error: Automation Error. Key not found


--- End code ---

We just need to test the returned value, rather than have the function crash.

jlogan02:

--- Quote from: kdub on November 18, 2022, 07:13:53 PM ---Perhaps something like :
(may not be bomb proof :)


--- Code - Auto/Visual Lisp: --- (defun c:DoTest (/ oldName newName extensionDict layerFilter)  (or *acdoc*      (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))  )  (setq oldName "frutier"        newName "Fruitiers"  )   (if (and        (setq extensionDict               (vla-getExtensionDictionary (vla-get-Layers *acdoc*))        )        (setq layerFilters               (kdub:safeitem extensionDict "ACAD_LAYERFILTERS")        )      )    (if (setq layerFilter (kdub:safeitem layerFilters newName))      (princ        (strcat "\n" (vla-get-Name layerFilter) " already exists.")      )      ;;else      (if (setq layerFilter (kdub:safeitem layerFilters oldName))        (progn          ;;(vla-put-Name layerFilter newName)          (command "._-layer" "filter" "Rename" oldName newName "")          (princ "\nFilter name was changed.")        )        ;;else        (princ (strcat "\n" oldName " filter does not exists."))      )    )    ;;else     ;;   )   (princ))  ;;;-------------------------------------------------------------------- (defun kdub:safeitem (collection item / returnvalue)  (if (not (vl-catch-all-error-p             (setq returnvalue                    (vl-catch-all-apply                      'vla-item                      (list collection item)                    )             )           )      )    returnvalue  )) ;;;--------------------------------------------------------------------  
--- End quote ---

Just tested this with no luck. Well, that's not entirely true. Regardless if the old filter exists or not the routine tells me it doesn't exist. That's literally all it does.

For a dumb guy like me, your code makes perfect sense. I'll be darned if I see why it's not working. As I see it, it's an either or situation. If the "s" exists "NewName" do nothing. If the "s" doesn't exist OldName...rename the filter, add the "s".

Thanks for the explanation on the GetSafeItem.

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version