Jack_O'nei 发表于 2022-7-6 15:14:32

使用lisp或vba放置对象

嘿,伙计们。
 
你们有没有一个lisp或vba可以执行以下操作:
 
请容忍我,这需要一些描述。想象一下,如果你想要一个2.5英寸宽、50英寸高的矩形。现在想象一下,在同一水平平原上有10个这样的物体,但间隔不规则(如栅栏柱)。现在想象一个小菱形符号(菱形,对于喜欢技术术语的人来说),高4英寸,宽2英寸。我需要做的是复制这些小符号并将其放置在矩形旁边。我想象这个lisp或vba所做的就是这样。我已经把矩形放好了。一旦我确定需要这些符号离矩形底部有多远,我就在所有这些符号上画一条简单的线。然后我启动这个小程序,选择符号,然后选择线,它将钻石放在矩形的外侧,钻石的角接触到线和矩形的交点。换句话说,如果你看附件,我会从第一组开始,到第二组结束。如果它也能抹去这条线,那就太好了,但不是必要的。
 
垂直矩形的位置将在水平方向上发生变化,菱形的垂直位置也会发生变化。
 
有人能做这件事吗?
 
谢谢大家。

Lee Mac 发表于 2022-7-6 15:18:29

菱形/矩形是块还是多段线?
 
如果您可以发布我们必须处理的对象的样例图形(2000格式),可能会更容易

Jack_O'nei 发表于 2022-7-6 15:23:27

菱形是块,矩形是闭合多段线。嗯,大多数时候。有时它们可能是单独的线,但它们应该是闭合的多段线。我们还有其他一些软件可以为我们的数控锯提取这些东西的长度,它只在“0”层上寻找闭合的多段线(我知道,但我没有写)。菱形是钻机操作员的指示器。他的软件提取出这个东西的位置,然后钻孔机根据这个小方块的位置放入各种各样的孔或槽。当矩形均匀分布时,我只排列块,但当它们不规则分布时,这有点困难。
 
已包含示例对象。
 
谢谢
图纸1.dwg

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

试驾一下:
 

; Diamond ~ by Lee McDonnel

; Places a Diamond Block at the Intersection of a LWPolyline

;

(defun c:diamond (/ ss lEnt eLst sLin eLin pvert i int intLst)
(vl-load-com)
(if (and (setq ss (ssget '((0 . "LWPOLYLINE"))))
      (setq lEnt (car (entsel "\nSelect Intersecting Line > ")))
      (eq (cdr (assoc 0 (entget lEnt))) "LINE"))
   (progn
   (setq eLst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
       sLin (cdr (assoc 10 (entget lEnt)))
       eLin (cdr (assoc 11 (entget lEnt))))
   (foreach ent eLst
   (setq pVert (mapcar 'cdr (vl-remove-if '(lambda (x) (/= 10 (car x))) (entget ent))))
   (if (eq (setq i (length pVert)) 4)
   (progn
       (while (not (zerop (setq i (1- i))))
         (if (setq int (inters sLin eLin (nth i pVert) (nth (1- i) pVert)))
       (setq intLst (cons int intLst))))
       (setq intLst (vl-sort intLst '(lambda (x1 x2) (< (car x1) (car x2)))))
       (SetBlkTF "3ANSYMB")
       (entmake (list (cons 0 "INSERT") (cons 2 "3ANSYMB") (cons 10 (cadr intLst))))
       (entmake (list (cons 0 "INSERT") (cons 2 "3ANSYMB") (cons 10 (cons (- (caar intLst) 6.5515) (cdar intLst)))))))))
   (princ "\n<!> No Line Selected, or this isn't a Line! <!>"))
(princ))

(defun SetBlkTF    (n)
   (cond ((not (snvalid n))
      (princ "\nInvalid Block Name - " n)
      (exit))
   ((tblsearch "BLOCK" n))
   ((findfile (strcat n ".DWG"))
      (command "_.INSERT" n)
      (command))
   (T ; If all else fails....
      (entmake (list (cons 0 "BLOCK") (cons 2 n) (cons 10 (list 0 0 0)) (cons 70 0)))
      (entmake (list (cons 0 "TEXT")
             (cons 1 (strcat "BLOCK PLACECARD - " n))
             (cons 7 (cdr (assoc 2 (tblnext "STYLE" T))))
             (cons 8 "0")
             (cons 10 (list 0 0 0))
             (cons 11 (list 0 0 0))
             (cons 40 (max 1 (getvar "TEXTSIZE")))
             (cons 72 4)))
      (entmake (list (cons 0 "ENDBLK") (cons 8 "0")))))n)

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

以上内容应按照您发布的示例图形进行操作。
 
但是,由于钻石的基点在一侧,钻石的放置必须根据钻石的宽度(6.5515)进行调整,因此,上述代码不适用于所有通用“钻石”形状。

Jack_O'nei 发表于 2022-7-6 15:31:09

李,这太令人印象深刻了!非常感谢你!
 
不过我有一个问题。可能是我做得不对。出于测试目的,我在绘图中放置了4个垂直矩形,并在它们之间画了一条线。加载代码并启动它。以下是命令行历史记录:
 
命令:菱形
 
选择对象:指定对角点:4
 
选择对象:
 
选择相交线>
命令:
 
但它只把钻石放在左边的第一个。他们在正确的地方,但它并没有做到这四点。我选错了吗?我用了一个十字路口。
 
再次感谢你的帮助。

Lee Mac 发表于 2022-7-6 15:35:14

嗯。。。不确定。。。
 
请参阅视频:
金刚石拉链

Lee Mac 发表于 2022-7-6 15:37:29

删除该行的更新版本:
 

; Diamond ~ by Lee McDonnel

; Places a Diamond Block at the Intersection of a LWPolyline

;

;

(defun c:diamond (/ ss lEnt eLst sLin eLin pvert i int intLst)
(vl-load-com)
(if (and (setq ss (ssget '((0 . "LWPOLYLINE"))))
      (setq lEnt (car (entsel "\nSelect Intersecting Line > ")))
      (eq (cdr (assoc 0 (entget lEnt))) "LINE"))
   (progn
   (setq eLst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
       sLin (cdr (assoc 10 (entget lEnt)))
       eLin (cdr (assoc 11 (entget lEnt))))
   (foreach ent eLst
   (setq pVert (mapcar 'cdr (vl-remove-if '(lambda (x) (/= 10 (car x))) (entget ent))))
   (if (eq (setq i (length pVert)) 4)
   (progn
       (while (not (zerop (setq i (1- i))))
         (if (setq int (inters sLin eLin (nth i pVert) (nth (1- i) pVert)))
       (setq intLst (cons int intLst))))
       (setq intLst (vl-sort intLst '(lambda (x1 x2) (< (car x1) (car x2)))))
       (SetBlkTF "3ANSYMB")
       (entmake (list (cons 0 "INSERT") (cons 2 "3ANSYMB") (cons 10 (cadr intLst))))
       (entmake (list (cons 0 "INSERT") (cons 2 "3ANSYMB") (cons 10 (cons (- (caar intLst) 6.5515) (cdar intLst))))))))
   (entdel lEnt))
   (princ "\n<!> No Line Selected, or this isn't a Line! <!>"))
(princ))

(defun SetBlkTF    (n)
   (cond ((not (snvalid n))
      (princ "\nInvalid Block Name - " n)
      (exit))
   ((tblsearch "BLOCK" n))
   ((findfile (strcat n ".DWG"))
      (command "_.INSERT" n)
      (command))
   (T ; If all else fails....
      (entmake (list (cons 0 "BLOCK") (cons 2 n) (cons 10 (list 0 0 0)) (cons 70 0)))
      (entmake (list (cons 0 "TEXT")
             (cons 1 (strcat "BLOCK PLACECARD - " n))
             (cons 7 (cdr (assoc 2 (tblnext "STYLE" T))))
             (cons 8 "0")
             (cons 10 (list 0 0 0))
             (cons 11 (list 0 0 0))
             (cons 40 (max 1 (getvar "TEXTSIZE")))
             (cons 72 4)))
      (entmake (list (cons 0 "ENDBLK") (cons 8 "0")))))n)

Jack_O'nei 发表于 2022-7-6 15:42:29

那部小电影很酷。。。你是怎么做到的?
 
不管怎样,我知道其中可能有什么。。。你用的是2004年,我用的是2007年和2008年。

Lee Mac 发表于 2022-7-6 15:44:07

版本之间不应该有太大的差异-是否发生了错误?
 
至于视频:
 
http://www.microsoft.com/windows/windowsmedia/forpros/encoder/default.mspx
页: [1] 2
查看完整版本: 使用lisp或vba放置对象