将块添加到端点和alig
你好我正在寻找一种lisp,它可以在一条多段线的每个端点上添加一个块(例如箭头),并将其与该多段线对齐。有什么想法吗?
提前谢谢你。 我想我最近在这里写过这样的代码:
http://www.cadtutor.net/forum/showthread.php?52992-可能在多线点上自动插入块&p=358763&viewfull=1#post358763
作为对此的快速修改:
;;-------------------=={ Block At Ends }==--------------------;;
;; ;;
;;Inserts a Block at each endpoint of a polyline ;;
;;------------------------------------------------------------;;
;;Author: Lee McDonnell, 2010 ;;
;; ;;
;;Copyright © 2010 by Lee McDonnell, All Rights Reserved. ;;
;;Contact: Lee Mac @ TheSwamp.org, CADTutor.net ;;
;;------------------------------------------------------------;;
(defun c:BlockAtEnds ( / *error* _StartUndo _EndUndo _Insert _AngleAtParam doc block ss )
(vl-load-com)
;; © Lee Mac 2010
(setq block "test.dwg") ;; << Block Name
(defun *error* ( msg )
(and doc (_EndUndo doc))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ)
)
(defun _StartUndo ( doc ) (_EndUndo doc)
(vla-StartUndoMark doc)
)
(defun _EndUndo ( doc )
(if (= 8 (logand 8 (getvar 'UNDOCTL)))
(vla-EndUndoMark doc)
)
)
(defun _Insert ( block point rotation )
(entmakex
(list
(cons 0 "INSERT")
(cons 2block)
(cons 10 point)
(cons 50 rotation)
)
)
)
(defun _AngleatParam ( entity param )
(angle '(0. 0. 0.) (vlax-curve-getFirstDeriv entity param))
)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(cond
( (= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (getvar 'CLAYER))))))
(princ "\n** Current Layer Locked **")
)
( (not
(or
(and (tblsearch "BLOCK" (vl-filename-base block))
(setq block (vl-filename-base block))
)
(and
(setq block
(findfile
(strcat block
(if (eq "" (vl-filename-extension block)) ".dwg" "")
)
)
)
(
(lambda ( / ocm )
(setq ocm (getvar 'CMDECHO)) (setvar 'CMDECHO 0)
(command "_.-insert" block) (command)
(setvar 'CMDECHO ocm)
(tblsearch "BLOCK" (setq block (vl-filename-base block)))
)
)
)
)
)
(princ "\n** Block not Found **")
)
( (not (setq ss (ssget '((0 . "*POLYLINE")))))
(princ "\n*Cancel*")
)
(t
(_StartUndo doc)
(
(lambda ( i / e )
(while (setq e (ssname ss (setq i (1+ i))))
(foreach param (list (vlax-curve-getStartParam e) (vlax-curve-getEndParam e))
(_Insert block (vlax-curve-getPointatParam e param) (_AngleAtParam e param))
)
)
)
-1
)
(_EndUndo doc)
)
)
(princ)
)
-大卫 很好的解决方案David
这可能是表示块插入部分的另一种方式:
(defun c:patha (/ ss en ed pl)
(defun massoc (key alist / x nlist)
(foreach x alist
(if (eq key (car x))
(setq nlist (cons (cdr x) nlist))))
(reverse nlist))
(while (or (not ss)
(/= (sslength ss) 1))
(princ "\nSelect a LWPOLYINE Path")
(setq ss (ssget '((0 . "LWPOLYLINE")))))
(setq en (ssname ss 0)
ed (entget en)
pl (massoc 10 ed))
(entmake (list (cons 0 "INSERT")(cons 2 "ARROW")
(cons 10 (append (car pl) (list (cdr (assoc 38 ed)))))
(cons 50 (angle (car pl) (cadr pl)))))
(entmake (list (cons 0 "INSERT")(cons 2 "ARROW")
(cons 10 (append (last pl) (list (cdr (assoc 38 ed)))))
(cons 50 (angle (last pl) (nth (1- (length pl)) pl)))))
(prin1))
非常感谢您的快速回复。
不幸的是,我无法让BlockAtEnds工作(命令:BlockAtEnds),patha与我要查找的非常接近,但它只在pline的两端进入块。我想要的是在pline内的每个端点处设置该块。
再次感谢你。 李,
是的,那也行!对于新手来说,这只是一个更隐晦的问题-大卫
出了什么问题? 我刚刚输入了块文件名的完整路径,它成功了。但它只在多段线的两端添加块。我想在pline内的每个端点添加该块。
谢谢您
我想你指的是顶点…-看看我之前发布的链接 端点和垂直点之间有很大的区别
这不适用于圆弧分段的多段线路径
(repeat 2
(entmake (list (cons 0 "INSERT") (cons 2 "ARROW")
(cons 10 (append (car pl) (list (cdr (assoc 38 ed)))))
(cons 50 (angle (car pl) (cadr pl)))))
(setq pl (reverse pl))
)
-大卫 这使用了曲线函数,作为对该链接中发布内容的修改:
-----------------=={Block At Vertices}==---------------;;;;在选定多段线的每个顶点插入块;;;;旋转到顶点后的线段角度。;;;------------------------------------------------------------;;;;作者:李·麦克唐纳,2010;;;;版权所有©2010 Lee McDonnell,保留所有权利;;;;联系人:Lee Mac@TheSwamp。组织,CADTutor。net;;;;-----------------------------------------------------------------;;(defun c:块顶点(/*error*_StartUndo _EndUndo _Insert _AngleAtParam doc block ss)(vl load com);;©Lee Mac 2010(setq block“test.dwg”);;
页:
[1]
2