CarlTonDor 发表于 2022-7-6 10:03:26

从dr创建块的Lsp

再一次,我在lsp上寻求帮助,这可以帮助我减少CAD处理时间和错误。
 
情况:
我必须放大或缩小客户提供的图纸中的“多段线”尺寸。这些多段线大多是“矩形”或“正方形”。
由于它们不是块形式,我必须手动将它们编辑到我想要的维度。这花了我很多时间,以前我甚至把它们放大到了错误的尺寸。
 
问题:
是否可以使用lsp脚本将相同尺寸的“矩形”或“正方形”转换为块形式?
如果不同的块可以分为不同的层就好了。(层的名称并不重要)
这个脚本是否太难构建?
 
我附上了这幅画的样本。(仅需转换3种类型)
 
如果有专家能就此问题向我提供建议,我将不胜感激。
谢谢您!:眨眼:
 
卡尔
实例拉链

VVA 发表于 2022-7-6 10:17:12

试试看
SetNB-将选定实体转换为块
SetNB1-在单独的命名块中转换每个选定的基元

(defun c:setnb (/ ss adoc pt_lst center blk *error* bi bname bpat)
;;;Selected Entities To Named Block
(setq bpat "BLOCK-") ;_ <- Edit block name pattern here
(defun *error* (msg)
   (vla-endundomark adoc)
   (princ msg)
   (princ)
   ) ;_ end of defun
(vl-load-com)
(vla-startundomark
   (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
   ) ;_ end of vla-StartUndoMark
(if (not (vl-catch-all-error-p
            (vl-catch-all-apply '(lambda () (setq ss (ssget "_:L"))))
            ) ;_ end of vl-catch-all-error-p
          ) ;_ end of not
   (progn
   (setq
       ss   (mapcar 'vlax-ename->vla-object
                      (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
                      ) ;_ end of mapcar
       pt_lst (apply 'append
                     (mapcar
                     '(lambda (x / minp maxp)
                        (vla-getboundingbox x 'minp 'maxp)
                        (list (vlax-safearray->list minp)
                              (vlax-safearray->list maxp)
                              ) ;_ end of append
                        ) ;_ end of lambda
                     ss
                     ) ;_ end of mapcar
                     ) ;_ end of append
       center (mapcar '(lambda (a b) (/ (+ a b) 2.))
                      (list (apply 'min (mapcar 'car pt_lst))
                            (apply 'min (mapcar 'cadr pt_lst))
                            (apply 'min (mapcar 'caddr pt_lst))
                            ) ;_ end of list
                      (list (apply 'max (mapcar 'car pt_lst))
                            (apply 'max (mapcar 'cadr pt_lst))
                            (apply 'max (mapcar 'caddr pt_lst))
                            ) ;_ end of list
                      ) ;_ end of mapcar
       bname
       (progn
         (setq bi 0)
         (while (tblsearch "BLOCK" (setq bname (strcat bpat (itoa(setq bi(1+ bi)))))))
            bname)
       blk    (vla-add (vla-get-blocks adoc)
                     (vlax-3d-point center)
                     bname
                     ) ;_ end of vla-add
       ) ;_ end of setq
   (vla-copyobjects
       adoc
       (vlax-make-variant
         (vlax-safearray-fill
         (vlax-make-safearray vlax-vbobject (cons 0 (1- (length ss))))
         ss
         ) ;_ end of vlax-safearray-fill
         ) ;_ end of vlax-make-variant
       blk
       ) ;_ end of vla-copyobjects
   (vla-insertblock
       (vla-objectidtoobject adoc (vla-get-ownerid (car ss)))
       (vlax-3d-point center)
       (vla-get-name blk)
       1.0
       1.0
       1.0
       0.0
       ) ;_ end of vla-insertblock
   (mapcar 'vla-erase ss)
   ) ;_ end of and
   ) ;_ end of if
(vla-endundomark adoc)
(princ)
) ;_ end of defun

(defun c:SETNB1 (/ ss adoc pt_lst center blk *error* lst bpat bname bi)
;;;Each primitive in a separate named block
;;;Каждый примитив в отдельный Имсенованный блок
(defun *error* (msg)
   (vla-endundomark adoc)
   (princ msg)
   (princ)
   ) ;_ end of defun
(setq bpat "BLOCK-") ;_ <- Edit block name pattern here
(vl-load-com)
(vla-startundomark
   (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
   ) ;_ end of vla-StartUndoMark
(if (not (vl-catch-all-error-p
            (vl-catch-all-apply '(lambda () (setq ss (ssget "_:L"))))
            ) ;_ end of vl-catch-all-error-p
          ) ;_ end of not
   (progn
   (mapcar '(lambda(item)
   (setq
ss (list item)
       pt_lst (apply 'append
                     (mapcar
                     '(lambda (x / minp maxp)
                        (vla-getboundingbox x 'minp 'maxp)
                        (list (vlax-safearray->list minp)
                              (vlax-safearray->list maxp)
                              ) ;_ end of append
                        ) ;_ end of lambda
                     ss
                     ) ;_ end of mapcar
                     ) ;_ end of append
       center (mapcar '(lambda (a b) (/ (+ a b) 2.))
                      (list (apply 'min (mapcar 'car pt_lst))
                            (apply 'min (mapcar 'cadr pt_lst))
                            (apply 'min (mapcar 'caddr pt_lst))
                            ) ;_ end of list
                      (list (apply 'max (mapcar 'car pt_lst))
                            (apply 'max (mapcar 'cadr pt_lst))
                            (apply 'max (mapcar 'caddr pt_lst))
                            ) ;_ end of list
                      ) ;_ end of mapcar
       bname
       (progn
         (setq bi 0)
         (while (tblsearch "BLOCK" (setq bname (strcat bpat (itoa(setq bi(1+ bi)))))))
            bname)
       blk    (vla-add (vla-get-blocks adoc)
                     (vlax-3d-point center)
                     bname
                     ) ;_ end of vla-add
       ) ;_ end of setq
   (vla-copyobjects
       adoc
       (vlax-make-variant
         (vlax-safearray-fill
         (vlax-make-safearray vlax-vbobject (cons 0 (1- (length ss))))
         ss
         ) ;_ end of vlax-safearray-fill
         ) ;_ end of vlax-make-variant
       blk
       ) ;_ end of vla-copyobjects
   (vla-insertblock
       (vla-objectidtoobject adoc (vla-get-ownerid (car ss)))
       (vlax-3d-point center)
       (vla-get-name blk)
       1.0
       1.0
       1.0
       0.0
       ) ;_ end of vla-insertblock
       )
(setq
       lst   (mapcar 'vlax-ename->vla-object
                      (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
                      ) ;_ end of mapcar
)
      )
   
   (mapcar 'vla-erase lst)
   ) ;_ end of and
   ) ;_ end of if
(vla-endundomark adoc)
(princ)
)

CarlTonDor 发表于 2022-7-6 10:25:18

你好,VVA,
 
非常感谢您的LSP!
 
我可以再要一个功能吗?
“SetNB1”正是我想要的。
但是,是否可以将选定的基本体转换为相同的块名?
当然,我会确保选择的形状是相同的。
对不起,如果我解释得不好。
希望你能理解我所说的。
 
我很高兴收到你的回复。
谢谢
 
卡尔

VVA 发表于 2022-7-6 10:32:38

另一种方法:在选定对象的中心(边界框)缩放选定对象

(defun c:sm (/ ERRCOUNT MAXPT MINPT MIPT MNPT MXPT
         OBJSET PTLST XLST YLST old Flg)
(vl-load-com)
(if(not sm:scale)(setq sm:scale 1))
   (initget 6)   
   (setq old sm:scale
         sm:scale(getdist
      (strcat"\nSpecify the scale factor <"(rtos sm:scale 2 2)">: "))
); end setq
(if(null sm:scale)(setq sm:scale old))
(setq errCount 0 ptLst 'nil Flg t); en setq
(while Flg
   (princ "\n§§§ Select objects and press Enter or Esc to exit. §§§")
(if
(not(setq objSet(ssget "_I")))
(setq objSet(ssget))
); end if
(if objSet
   (progn
   (setq objSet
      (mapcar 'vlax-ename->vla-object
                   (vl-remove-if 'listp
                  (mapcar 'cadr(ssnamex objSet)))))
   (foreach obj objSet
(vla-GetBoundingBox obj 'MinPt 'MaxPt)
   (setq mnPt(vlax-safearray->list MinPt)
    mxPt(vlax-safearray->list MaxPt)
    miPt (polar mnPt (angle mnPt mxPt)(* 0.5 (distance mnPt mxPt)))      
    )
    (if (vlax-method-applicable-p obj 'ScaleEntity)
    (if
   (vl-catch-all-error-p
(vl-catch-all-apply 'vla-ScaleEntity
    (list obj(vlax-3D-Point miPt) sm:scale)))
   (setq errCount(1+ errCount))
   )
      )
); end foreach
(princ(strcat "\n" (itoa errCount) " objects blocked layer! "))
)
   ); if objset
   (setq Flg nil)
); end while
)

VVA 发表于 2022-7-6 10:45:43

您必须确保所选形状相同

(defun c:SETNB2 (/ ss adoc pt_lst center blk *error* lst bpat bname bi first)
;;;Each primitive in a separate named block
;;;http://www.cadtutor.net/forum/showthread.php?p=287449&posted=1#post287449
(defun *error* (msg)
   (vla-endundomark adoc)
   (princ msg)
   (princ)
   ) ;_ end of defun
(setq bpat "BLOCK-") ;_ <- Edit block name pattern here
(vl-load-com)
(vla-startundomark
   (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
   ) ;_ end of vla-StartUndoMark
(if (not (vl-catch-all-error-p
            (vl-catch-all-apply '(lambda () (setq ss (ssget "_:L"))))
            ) ;_ end of vl-catch-all-error-p
          ) ;_ end of not
   (progn
   (mapcar '(lambda(item)
   (setq
ss (list item)
       pt_lst (apply 'append
                     (mapcar
                     '(lambda (x / minp maxp)
                        (vla-getboundingbox x 'minp 'maxp)
                        (list (vlax-safearray->list minp)
                              (vlax-safearray->list maxp)
                              ) ;_ end of append
                        ) ;_ end of lambda
                     ss
                     ) ;_ end of mapcar
                     ) ;_ end of append
       center (mapcar '(lambda (a b) (/ (+ a b) 2.))
                      (list (apply 'min (mapcar 'car pt_lst))
                            (apply 'min (mapcar 'cadr pt_lst))
                            (apply 'min (mapcar 'caddr pt_lst))
                            ) ;_ end of list
                      (list (apply 'max (mapcar 'car pt_lst))
                            (apply 'max (mapcar 'cadr pt_lst))
                            (apply 'max (mapcar 'caddr pt_lst))
                            ) ;_ end of list
                      ) ;_ end of mapcar
)
(if (null first)
(progn
    (setq
      bname
   (progn
       (setq bi 0)
       (while (tblsearch "BLOCK" (setq bname (strcat bpat (itoa(setq bi(1+ bi)))))))
       bname)
      blk
   (vla-add (vla-get-blocks adoc)
                     (vlax-3d-point center)
                     bname
              )
      ) ;_ end of setq
   (vla-copyobjects
       adoc
       (vlax-make-variant
         (vlax-safearray-fill
         (vlax-make-safearray vlax-vbobject (cons 0 (1- (length ss))))
         ss
         ) ;_ end of vlax-safearray-fill
         ) ;_ end of vlax-make-variant
       blk
       );_ end of vla-copyobjects
    (setq first t)
)
)
   
   (vla-insertblock
       (vla-objectidtoobject adoc (vla-get-ownerid (car ss)))
       (vlax-3d-point center)
       (vla-get-name blk)
       1.0
       1.0
       1.0
       0.0
       ) ;_ end of vla-insertblock
       )
(setq
       lst   (mapcar 'vlax-ename->vla-object
                      (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
                      ) ;_ end of mapcar
)
      )
   
   (mapcar 'vla-erase lst)
   ) ;_ end of and
   ) ;_ end of if
(vla-endundomark adoc)
(princ)
)

CarlTonDor 发表于 2022-7-6 10:52:25

VVA,
 
我衷心感谢你。
你的好意深深打动了我的感激之情。
 
卡尔

wizman 发表于 2022-7-6 10:56:05

只需添加,我将通过将块对齐为直线和多段线来实现,以下是我之前所做的:
 
;|******************************************************************创建用于将块恢复/对齐/替换为具有不同旋转的类似直线/多段线的程序日期:2008年11月20日创建人:RONALD MANEJA(WIZMAN)。。。email\u add:罗恩_09812001@yahoo.com----也可用于修改块的插入点***********************;(defun c:blocker(/blkname blocker\u kword bloker\u newset blok\u rot\u strng counter fpoint ronblock ronblockdata seta spoint*error*);;;;------------------------------------------------------------------------------------------;;;初始化setvar、rtd、dtr和*error*函数(setvar的cmdecho 0)(vl load com)(defun rtd(a)(/(*a 180)pi));_end_defun(defun DTR(a)(*PI(/a 180.0));_end_defun(defun*error*(msg)(vla EndUndoMark(vla Get ActiveDocument(vlax Get Acad Object));_end_vla-Get-ActiveDocument);_end_vla-EndUndoMark(setvar'cmdecho 1));_end_defun;;;--------------------------------------------------------------------------------;;;blok\u rot函数-相对旋转选择中的对象(defun blok\u rot(blok\u set/blok\u rot\u allset blok\u rot\u计数器)(setq blok\u rot\u allset blok\u set)(while(not)(成员(strcase)(setq blok\u rot\u strng(getstring“\n>>…按空格键/回车键继续旋转,移动或退出…>>:”);\uend_getint);_end_setq);_end_strcase’(“M”“E”);_end_成员);_end\u not(setq blok\u rot\u counter 0)(while(<blok\u rot\u counter(sslength blok\u rot\u allset))(命令“rotate”(ssname blok\u rot\u allset blok\u rot\u counter)”(cdr(assoc 10(entget(ssname blok\u rot\u allset blok\u rot\u counter));\uend_assoc);_end_cdr 90);_end_命令(setq blok_rot_计数器(1+blok_rot_计数器));_end_while);_end_while(if(=(strcase blok\u rot\u strng)“M”)(bmov bloker\u newset));_end\u if(if(=(strcase blok\u rot\u strng)“E”)(progn(initget 1“Yes No”)(setq blok\u del\u kword(getkword“\n>>>…是否要删除参考线[是/否]?…>>:”);\uend_getkword);_end\u setq(if(=blok\u del\u kword“Yes”)(progn(vl cmdf).\u erase“seta”)(*error*nil)(exit));\uend_progn(progn(*error*nil)(exit));_end_progn);_end_if);_end_progn);_end_if);_end_defun;;;--------------------------------------------------------------------------------;;;bmov函数-相对移动选择中的对象(defun bmov(bmov\u集/2nd\u pt\u bmov allset\u bmov ang\u bmov counter\u bmov dist\u bmov ent\u rot\u bmov)(setq allset\u bmov bmov\u集)(while(and(not(initget 129))(setq dist\u bmov(getdist“\n>>…输入移动距离,旋转或退出…>>:”;\uend_getdist);_end_setq;(成员(strcase dist\u bmov)“(R”“E”);_end\u和(cond((=(numberp dist\u bmov)T)(progn(而(progn(setq ang\u bmov(cond)((getint“\n输入相对方向));\uend_getint)(0));_end_cond);_end_setq(if(not(成员ang_bmov’(0 90 180 270-90));_end\u not(not(提示“\n错误角度必须为0 90 180 270,请重新输入”);\uend_提示符);_end_not);_end_if);_end_progn);_end\u while(setq counter\u bmov 0)(while(<counter\u bmov(sslength allset\u bmov))(setq ent\u rot\u bmov(cdr(assoc 50(entget(ssname allset\u bmov counter\u bmov)));\uend_cdr);_end\u setq(setq 2nd\u pt\u bmov(polar(cdr(assoc 10(entget(ssname allset\u bmov counter\u bmov))))(+ent\u rot\u bmov(dtr ang\u bmov))dist\u bmov);\uend_polar);_end_setq(命令“move”(ssname allset\u bmov counter\u bmov)“”“_non”(cdr(assoc 10(entget(ssname allset\u bmov counter\u bmov)))“_non”2nd\u pt\u bmov);_end_命令(setq counter_bmov(1+counter_bmov))end_while);_end\u progn)((=(strcase dist\u bmov)“R”)(blok\u rot bloker\u newset))((=(strcase dist\u bmov)“E”)(progn(initget 1“Yes No”)(setq blok\u del\u kword(getkword“\n>>…是否要删除参考线[是/否]?…>>:”;\uend_getkword);_end\u setq(if(=blok\u del\u kword“Yes”)(progn(vl cmdf).\u erase“seta”)(*error*nil)(exit));\uend_progn(progn(*error*nil)(exit));_end_progn);_end_if);_end_progn));_end_cond);_end_while);_end_defun;;;--------------------------------------------------------------------------------;;;结束撤消,开始撤消(vla EndUndoMark(vla Get ActiveDocument(vlax Get Acad Object));_end_vla-Get-ActiveDocument);_end_vla-EndUndoMark(vla StartUndoMark(vla Get ActiveDocument(vlax Get Acad Object));_end_vla-Get-ActiveDocument);_end_vla-StartUndoMark;;;-----------------------------------------------------------------;;;主例程(while(not(and)(或(setq ronblock(car(entsel“\n>>>…选择一个块…>>”))))(提示“\n missed,重试。”);\uend\u或(或(=(cdr(assoc 0(entget ronblock)))“INSERT”)(提示“\n>>…这不是块,这次选择块……选择要对齐的线或多段线…>>>”;\uend\u提示符(setq seta(ssget’((0。“LWpolyline,line”)))(setq计数器0)(setq bloker\u newset(ssadd))(mapcar’(lambda(x)(setq fpoint(vlax curve getPointAtParam x 0))(setq spoint(vlax curve getPointAtParam x 1))(entmake(list(cons 0“INSERT”)(cons 2 blkname)(10 fpoint)(cons 41 1)(cons 42 1)(cons 43 1)(cons 50(角度fpoint spoint));_end_列表);_end\u entmake(ssadd(entlast)bloker\u newset);(vla删除x));_end_lambda(mapcar“vlax ename->vla object(vl remove if”listp(mapcar”cadr(ssnamex seta));_vl结束删除if);_end_mapcar);_end\u mapcar(princ(strcat“\n添加到图形的块的数量=(vl princ to string(sslength bloker\u newset));\uend_strcat);_end\u princ(initget 7“Move Rotate Exit”)(if(setq blocker\u kword(getkword“\n是否要[旋转/移动/退出]?:”))(progn(if(null blocker\u kword)(setq blocker\u kword“退出”);\uend\u if(cond((=blocker\u kword“Move”)((bmov bloker\u newset))(=blocker\u kword“Rotate”)((blok\u rot bloker\u newset))((=blocker\u kword“Exit”)(progn(initget 1“Yes No”)(setq blok\u del\u kword(getkword“\n>>>…是否要删除参考线[是/否]?…>>:”;\uend\u ge公司

Jaap Marchal 发表于 2022-7-6 11:04:20

Is it possible with SETNB2.lsp to keep the hyperlink attached.
 
 
Jaap
页: [1]
查看完整版本: 从dr创建块的Lsp