rouho 发表于 2022-7-6 10:13:52

将块添加到端点和alig

你好
 
我正在寻找一种lisp,它可以在一条多段线的每个端点上添加一个块(例如箭头),并将其与该多段线对齐。有什么想法吗?
 
提前谢谢你。

Lee Mac 发表于 2022-7-6 10:22:43

我想我最近在这里写过这样的代码:
 
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 Bethel 发表于 2022-7-6 10:27:25

很好的解决方案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))

 

Lee Mac 发表于 2022-7-6 10:27:57

非常感谢您的快速回复。
 
不幸的是,我无法让BlockAtEnds工作(命令:BlockAtEnds),patha与我要查找的非常接近,但它只在pline的两端进入块。我想要的是在pline内的每个端点处设置该块。
 
再次感谢你。

rouho 发表于 2022-7-6 10:36:48

李,
 
是的,那也行!对于新手来说,这只是一个更隐晦的问题-大卫

David Bethel 发表于 2022-7-6 10:40:16

 
出了什么问题?

Lee Mac 发表于 2022-7-6 10:44:17

我刚刚输入了块文件名的完整路径,它成功了。但它只在多段线的两端添加块。我想在pline内的每个端点添加该块。
 
谢谢您

rouho 发表于 2022-7-6 10:50:06

 
我想你指的是顶点…-看看我之前发布的链接

Lee Mac 发表于 2022-7-6 10:53:45

端点和垂直点之间有很大的区别
 
这不适用于圆弧分段的多段线路径
 

(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))
)
 
-大卫

David Bethel 发表于 2022-7-6 10:59:51

这使用了曲线函数,作为对该链接中发布内容的修改:
 
-----------------=={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
查看完整版本: 将块添加到端点和alig