Lee Mac 发表于 2022-7-6 15:00:30

哦,请记住,上面发布的代码不会检查是否加载了线型。
 
要记住的事情。

Lee Mac 发表于 2022-7-6 15:04:05

这将加载未加载的线型
 

(defun MkLay (Nme Col lTyp lWgt Plt / lay)
(vl-load-com)
(setq lay
   (vla-add
   (vla-get-layers
       (vla-get-ActiveDocument
         (vlax-get-acad-object))) Nme))
(and Col (vla-put-Color lay Col))
(and lTyp (lTload lTyp) (vla-put-Linetype lay lTyp))
(and lWgt(vla-put-LineWeight lay lWgt))
(and (not Plt) (vla-put-Plottable lay :vlax-false)))

(defun lTload (lTyp)
(or (tblsearch "LTYPE" lTyp)
   (vla-load
       (vla-get-Linetypes
         (vla-get-ActiveDocument
         (vlax-get-acad-object))) lTyp "acad.lin")))

(defun c:DoLayers ()
(purgelayers)
(mapcar 'MkLay
         '( "CEN"   "DIMS" "HAT""HID"   "LOGO" "OBJ""PAPER"   "PHAN"   "TITLE" "TXT"); Name
         '(   6       1      3      4       176    2       5         6       176   7); Colours
         '("CENTER"nil    nil"HIDDEN"   nil   nil"PHANTOM" "PHANTOM"   nil    nil ); LineType
         '(0.18   0.18   0.18    0.15    0.090.40   nil      0.18      nil    nil ); LineWeight
         '(   T       T      T      T      T   T      nil      T      T      T)) ; Plottable (T or nil)
(princ))

bradb 发表于 2022-7-6 15:07:46


(defun purgelayers ()
(command "-purge" "LA" "" "N")
)

 
 
这是purgelayers,他们知道我以前没有抄过。基本上,我想清除所有不是lisp中提供的层名称的层

bradb 发表于 2022-7-6 15:12:16

李跑了你的,唯一的事情是没有拿起线宽。所有图层设置均设置为执行linewieght设置为0.00

Lee Mac 发表于 2022-7-6 15:16:05

 
将检查-
 
你注意到速度差了吗?

Lee Mac 发表于 2022-7-6 15:17:04

好的,这应该可以:
 

(defun MkLay (Nme Col lTyp lWgt Plt / lay)
(vl-load-com)
(setq lay
   (vla-add
   (vla-get-layers
       (vla-get-ActiveDocument
         (vlax-get-acad-object))) Nme))
(and Col (vla-put-Color lay Col))
(and lTyp (lTload lTyp) (vla-put-Linetype lay lTyp))
(and lWgt(vla-put-LineWeight lay (eval (read (strcat "acLnWt" lWgt)))))
(and (not Plt) (vla-put-Plottable lay :vlax-false)))

(defun lTload (lTyp)
(or (tblsearch "LTYPE" lTyp)
   (vla-load
       (vla-get-Linetypes
         (vla-get-ActiveDocument
         (vlax-get-acad-object))) lTyp "acad.lin"))
t)


(defun c:DoLayers (/ cm)
(vl-load-com)
(setq cm (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(vl-cmdf "_.-purge" "_LA" "*" "_N")

(mapcar 'MkLay
         
         '( "CEN"   "DIMS" "HAT""HID"   "LOGO" "OBJ""PAPER"   "PHAN"   "TITLE" "TXT"); Name
         '(   6       1      3      4       176    2       5         6       176   7); Colours
         '("CENTER"nil    nil"HIDDEN"   nil   nil"PHANTOM" "PHANTOM"   nil    nil ); LineType
         '( "018"   "018""018""015"    "009" "040"    nil      "018"   nil    nil ); LineWeight 0.18 = "018"
         '(   T       T      T      T      T   T      nil      T      T      T)) ; Plottable (T or nil)

(setvar "CMDECHO" cm)
(princ))

MarcoW 发表于 2022-7-6 15:19:25

李,这就是我的解决方案。
 
我想在插入特定块时创建一个特定层,即在层“box”、线型中心、设置为非打印的层中插入一个名为“box”的块,我使用内部菜单中的宏:
 
^C^Ccreatelayer;Center;m_boxes;3;n;
 
这是打开图形时启动的lisp:
 

(defun c:createlayer (/ ltname layname laycol cmdold lay)
(vl-load-com)
(setq ltname (getstring "\nPlease enter the name of the linetype: ")
       layname (getstring "\nPlease enter the name of the layer: ")
       laycol (getint "\nPlease enter the colour of the layer: ")
layplot (getstring "\nDo you want the layer to be <Plot> or <Non plot>: ")
       cmdold (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
;; Loading Linetype~ Another option to consider:
(if (not (tblsearch "LTYPE" ltname))
   (vla-load
   (vla-get-Linetypes
       (vla-get-ActiveDocument
         (vlax-get-acad-object))) ltname "acad.lin"))
;; Layer Checking & Creation
(if (not (tblsearch "LAYER" layname))
   (command "_.-layer" "_M" layname "_L" ltname layname "_C" laycol layname "_P" layplot "" "")
   (setvar "CLAYER" layname))
;; Another Option for Layer Creation to Consider:
(if (not (tblsearch "LAYER" layname))
   (progn
   (setq lay (vla-add
               (vla-get-layers
                   (vla-get-ActiveDocument
                     (vlax-get-acad-object))) layname))
   (vla-put-color lay laycol)
   (vla-put-linetype lay ltname)))
(setvar "CLAYER" layname)
;; Reset CMDECHO
(setvar "CMDECHO" cmdold)
(princ))

 
所以现在我在宏中指定层,这给了我很大的灵活性,每当有一种新的块要插入时,我就创建层。。。
 
但是所有的功劳都要归功于李,没有你的帮助,我是不可能做到的。

bradb 发表于 2022-7-6 15:24:51

 
 
是的,李,快一点谢谢
 
哦,你使用的vl-load-com和vla是什么?

Lee Mac 发表于 2022-7-6 15:27:41

 
它们是Visual LISP方法-AfraLISP有很多关于它们的信息

Lee Mac 发表于 2022-7-6 15:31:27

 
谢谢Marco,
 
但请记住,对于您的代码,您有两个部分做相同的事情。-您可能需要考虑删除一个。
页: 1 [2]
查看完整版本: 检查/创建图层问题