乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 63|回复: 13

[编程交流] 使用lisp gettin重命名层

[复制链接]

6

主题

60

帖子

54

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 20:15:03 | 显示全部楼层 |阅读模式
你好
 
我在论坛上发现了这个非常好的惯例,但不知道我要感谢谁(gilsoto13?)。
我已经在家里的CAD 2011上测试了这些LISP。工作正常。
但在CAD 2007 Electrical上,我发现了这个错误:
 
 
我在网上查了一下,发现它与选择集(lisp选择集谓词)有关?
就像例程期望选择一样,或者我的选择集为零?我应该在某个地方,从谓词的东西中提取a-p吗?
 
代码如下:
 
  1. ;;function to rename a layer.
  2. ;;if old layer exists, and new layer doesn't exist, the old layer is simply renamed.
  3. ;;if old layer exists, and new layer is already there, it takes everything on old layer and puts them on new layer.
  4. ;;if old layer doesn't exist, it does nothing.
  5. (defun renlay (ol nl / ss i ent )
  6. (cond ((and (tblsearch "layer" ol) (not (tblsearch "layer" nl)))
  7. (command "._rename" "la" ol nl)
  8. )
  9. ((and (tblsearch "layer" ol)(tblsearch "layer" nl))
  10.   (setq ss (ssget "x" (list (cons 8 ol))))
  11.   (setq i -1)
  12.    (repeat (sslength ss)
  13.       (setq ent (entget (ssname ss (setq i (1+ i))))
  14.      ent (subst (cons 8 nl) (cons 8 (cdr (assoc 8 ent))) ent)
  15.       )   
  16.       (entmod ent)
  17.           )
  18. )
  19. ((not (tblsearch "layer" ol))
  20.   (prompt (strcat "\nLayer " ol " not found. "))
  21.        )
  22. )
  23. (princ)
  24. )
  25. ;;example
  26. (defun c:test ()
  27. (renlay "ENG" "GE_TXT_LANGUAGE_EN")
  28. (renlay "NL" "GE_TXT_LANGUAGE_DU")
  29. (renlay "DUITS" "GE_TXT_LANGUAGE_GE")
  30. (renlay "FR" "GE_TXT_LANGUAGE_FR")
  31. )

 
Thx提前。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:23:30 | 显示全部楼层
也许可以试试这样:
 
  1. (defun RenameLayer ( old new )
  2. ;; © Lee Mac 2010
  3. (if (tblsearch "LAYER" old)
  4.    (if (tblsearch "LAYER" new)
  5.      (if (setq ss (ssget "_X" (list (cons 8 old))))
  6.        (
  7.          (lambda ( i )
  8.            (while (setq e (ssname ss (setq i (1+ i))))
  9.              (entupd
  10.                (cdr
  11.                  (assoc -1
  12.                    (entmod
  13.                      (list (assoc -1 (entget e)) (cons 8 new))
  14.                    )
  15.                  )
  16.                )
  17.              )
  18.            )
  19.          )
  20.          -1
  21.        )
  22.      )
  23.      (
  24.        (lambda ( old )
  25.          (entmod
  26.            (subst
  27.              (cons 2 new) (assoc 2 old) old
  28.            )
  29.          )
  30.        )
  31.        (entget (tblobjname "LAYER" old))
  32.      )
  33.    )
  34.    (princ (strcat "\n--> Layer: " old " not found."))
  35. )
  36. (princ)
  37. )
  38. (defun c:test ( / o n )
  39. (if
  40.    (and
  41.      (setq o (getstring t "\nSpecify Layer to be Renamed: "))
  42.      (setq n (getstring t "\nSpecify New Layer Name: "))
  43.    )
  44.    (RenameLayer o n)
  45. )
  46. (princ)
  47. )
回复

使用道具 举报

6

主题

60

帖子

54

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 20:27:12 | 显示全部楼层
Thx Lee,
 
它工作得很好,但我认为它帮助不大。
看,我想处理1300个文件。
它们都需要创建层并重命名一些层。
如果你不介意,我将使用你的一些代码来创建层:
 
  1. (defun MakeLayer ( name colour linetype lineweight willplot bitflag description )
  2. ;; © Lee Mac 2010
  3. (or (tblsearch "LAYER" name)
  4.    (entmake
  5.      (append
  6.        (list
  7.          (cons 0 "LAYER")
  8.          (cons 100 "AcDbSymbolTableRecord")
  9.          (cons 100 "AcDbLayerTableRecord")
  10.          (cons 2  name)
  11.          (cons 70 bitflag)
  12.          (cons 290 (if willplot 1 0))
  13.          (cons 6
  14.            (if (and linetype (tblsearch "LTYPE" linetype))
  15.              linetype "CONTINUOUS"
  16.            )
  17.          )
  18.          (cons 62 (if (and colour (< 0 (abs colour) 256)) colour 7))
  19.          (cons 370
  20.            (fix
  21.              (* 100
  22.                (if (and lineweight (<= 0.0 lineweight 2.11)) lineweight 0.0)
  23.              )
  24.            )
  25.          )
  26.        )
  27.        (if description
  28.          (list
  29.            (list -3
  30.              (list "AcAecLayerStandard" (cons 1000 "") (cons 1000 description))
  31.            )
  32.          )
  33.        )
  34.      )
  35.    )
  36. )
  37. )
  38. (defun c:MakeLayers nil (vl-load-com)
  39. ;; © Lee Mac 2010
  40. ;; Specifications:
  41. ;; Description        Data Type        Remarks
  42. ;; -----------------------------------------------------------------
  43. ;; Layer Name          STRING          Only standard chars allowed
  44. ;; Layer Colour        INTEGER         may be nil, -ve for Layer Off, Colour < 256
  45. ;; Layer Linetype      STRING          may be nil, If not loaded, CONTINUOUS.
  46. ;; Layer Lineweight    REAL            may be nil, 0 <= x <= 2.11
  47. ;; Plot?               BOOLEAN         T = Plot Layer, nil otherwise
  48. ;; Bit Flag            INTEGER         0=None, 1=Frozen, 2=Frozen in VP, 4=Locked
  49. ;; Description         STRING          may be nil for no description
  50. ;; Function will return list detailing whether layer creation is successful.   
  51. (
  52.    (lambda ( lst / lts ) (setq lts (vla-get-Linetypes (vla-get-ActiveDocument (vlax-get-acad-object))))
  53.      (mapcar 'cons (mapcar 'car lst)
  54.        (mapcar
  55.          (function
  56.            (lambda ( x )
  57.              (and (caddr x)
  58.                (or (tblsearch "LTYPE" (caddr x))
  59.                  (vl-catch-all-apply 'vla-load (list lts (caddr x) "acad.lin"))
  60.                )
  61.              )
  62.              (apply 'MakeLayer x)
  63.            )
  64.          )
  65.          lst
  66.        )
  67.      )
  68.    )
  69.   '(
  70.     ;    Name        Colour        Linetype        Lineweight        Plot?        BitFlag        Description
  71.     (    "CEN"         6           "CENTER"           0.18            T             0               nil      )
  72.     (    "DIMS"       -1             nil              0.18            T             0               nil      )
  73.     (    "HAT"         3             nil              0.18            T             0               nil      )
  74.     (    "HID"         4           "HIDDEN"           0.15            T             0             "Hidden"   )
  75.     (    "LOGO"       176            nil              0.09            T             0            "For Logo"  )
  76.     (    "OBJ"        -2             nil              0.40            T             0               nil      )
  77.     (    "PAPER"       5           "PHANTOM"           nil            T             0               nil      )
  78.     (    "PHAN"        6           "PHANTOM"          0.18            T             0               nil      )
  79.     (    "TITLE"      176            nil               nil            T             0            "For Title" )
  80.     (    "TXT"         7             nil               nil            T             0               nil      )
  81.    )
  82. )
  83. )

这将完成层转换器所做的工作,但只需1秒
您确实需要始终使用相同的旧层,但大多数情况下都是这样。
  1. (dolayers);creates new layers if not already there.
  2. (setlayernew);will merge all old layers that are set with the new ones.
  1. ;;function to rename a layer.
  2. ;;if old layer exists, and new layer doesn't exist, the old layer is simply renamed.
  3. ;;if old layer exists, and new layer is already there, it takes everything on old layer and puts them on new layer.
  4. ;;if old layer doesn't exist, it does nothing.
  5. (defun renlay (ol nl / ss i ent )
  6. (cond ((and (tblsearch "layer" ol) (not (tblsearch "layer" nl)))
  7. (command "._rename" "la" ol nl)
  8. )
  9. ((and (tblsearch "layer" ol)(tblsearch "layer" nl))
  10. (command "-LAYMRG" "N" ol "" "N" nl "Y")
  11.        )
  12. ((not (tblsearch "layer" ol))
  13.   (prompt (strcat "\nLayer " ol " not found. "))
  14.        )
  15. )
  16. (princ)
  17. )
  18. ;;example
  19. (defun c:setlayernew ()
  20. (command "-layer" "s" "0" "")
  21. (renlay "1" "01 Dimensions")
  22. (renlay "2" "02 Project dimensions notes")
  23.    (renlay "8" "05 Center")
  24. (renlay "9" "08 Surrounding")
  25. (renlay "11" "05 Center")
  26. (renlay "13" "13 Border")
  27. (renlay "BORDER" "13 Border")
  28. (renlay "BORDER-V" "13 Border")
  29. (renlay "HORIZONTAL REF BOX" "0")
  30. (renlay "LOGO" "01 Dimensions")
  31. (renlay "3D" "0")
  32. (renlay "3d" "0")
  33.   (renlay "Dimension (ISO)" "01 Dimensions")
  34. (renlay "Visible (ISO)" "0")
  35. (renlay "Visible Narrow (ISO)" "0")
  36. (renlay "Border (ISO)" "13 Border")
  37. (renlay "Title (ISO)" "13 Border")
  38. (princ)(princ "Layers renamed and merged")  
  39. )
回复

使用道具 举报

20

主题

81

帖子

61

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 20:33:00 | 显示全部楼层
 
是的,您可以检查有效的SelectionSet,我的代码就是这样做的。你是说你仍然收到错误?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:36:32 | 显示全部楼层
您可能需要使用以下内容:
 
  1. (defun MkLay (Nme Col lTyp lWgt Plt / lays lay)
  2. (vl-load-com)
  3. (setq lays (vla-get-layers
  4.               (vla-get-ActiveDocument
  5.                 (vlax-get-acad-object)))
  6.        lay (cond ((tblsearch "LAYER" Nme)
  7.                   (vla-item lays Nme))
  8.                  (t (vla-add lays Nme))))
  9. (and Col (vla-put-Color lay Col))
  10. (and lTyp (lTload lTyp) (vla-put-Linetype lay lTyp))
  11. (and lWgt  (vla-put-LineWeight lay (eval (read (strcat "acLnWt" lWgt)))))
  12. (and (not Plt) (vla-put-Plottable lay :vlax-false)))
  13. (defun lTload (lTyp)
  14. (or (tblsearch "LTYPE" lTyp)
  15.      (vla-load
  16.        (vla-get-Linetypes
  17.          (vla-get-ActiveDocument
  18.            (vlax-get-acad-object))) lTyp "acad.lin")))
  19. (defun c:DoLayers ( / )
  20. (vl-load-com)
  21. (mapcar 'MkLay
  22.          
  23.          '(         "01 Dimensions"           "02 Project dimensions notes"         )  ; Name [str]
  24.          '(         1                           nil                                 )    ; Colours [int]
  25.          '(         nil                     nil              ) ; LineType [str]
  26.          '(         nil                           nil                 )  ; LineWeight [str] 0.18 = "018"
  27.          '(           T                       T     )) ; Plottable (T or nil)
  28. (princ)(princ "New layers set")
  29. (princ))

 
根据需要更改关联列表(“OLDLAYER”、“NEWLAYER”)
 
这更像是一种暴力手段,但:
[列表]
  • 它可以处理较重的多段线
  • 处理锁定层
  • 包括所有块定义
    [/列表]
     
    -大卫
  • 回复

    使用道具 举报

    26

    主题

    1495

    帖子

    20

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    118
    发表于 2022-7-5 20:41:50 | 显示全部楼层
    呜呜!
     
    Thx CADkitt,效果很好!
     
    @李
    不。你的代码也运行得很好
     
     
    祝你们俩多谢。
     
    某人
    回复

    使用道具 举报

    6

    主题

    60

    帖子

    54

    银币

    初来乍到

    Rank: 1

    铜币
    30
    发表于 2022-7-5 20:43:07 | 显示全部楼层
    thx David公司
    回复

    使用道具 举报

    6

    主题

    60

    帖子

    54

    银币

    初来乍到

    Rank: 1

    铜币
    30
    发表于 2022-7-5 20:48:13 | 显示全部楼层
    还有,如何更改标注样式名称
    回复

    使用道具 举报

    44

    主题

    139

    帖子

    95

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    220
    发表于 2022-7-5 20:55:45 | 显示全部楼层
    使用-重命名
    然后将其放入(命令“-rename”“dimstyle”“oldname”“newname”)
    回复

    使用道具 举报

    20

    主题

    81

    帖子

    61

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    100
    发表于 2022-7-5 20:57:51 | 显示全部楼层
    但是我怎么能把那个样式和标准图层放在所有的dwg中呢?我打开了它。
    回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

    QQ|关于我们|小黑屋|乐筑天下 繁体中文

    GMT+8, 2025-3-11 09:16 , Processed in 0.470205 second(s), 72 queries .

    © 2020-2025 乐筑天下

    联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表