Miller87 发表于 2022-7-5 19:51:46

在li的中点插入块

早上好,我需要一个lisp,它可以自动在预定长度的每个特定行的中点插入一个块。
 
我在图纸中创建了几个块,称为:
-“50m”->插入500 mm直线的中点
-“100m”->插入1000 mm线的中点。
ecc。。
我写了这个粗糙的代码
 

(defun C:blockparlines (/)

(setq s (ssget "x" '((0 . "LINE" ))))




;FILTER SELECTION FOR LINES WITH LENGTH 500 mm
(setq ss1 (ssadd))
(setq lung 500)
(setq ss2 s)
(if ss2 (progn
(setq i 0ssl (sslength ss2))
(repeat ssl
(setq ename (ssname ss2 i))
(setq ll (distance (cdr (assoc 10 (entget ename))) (cdr (assoc 11 (entget ename)))))
(if (= lung ll)(ssadd ename ss1))
(setq i (1+ i))
)
(princ (strcat (itoa (sslength ss1)) " generated block's of 500 mm."))
;(sssetfirst nil ss1)
))
(princ)


;INSERT BLOCK IN MIDPOINT of 500 mm

(setq name "50M")
(repeat (setq i (sslength ss1))
      (setq e (entget (ssname ss1 (setq i (1- i)))))
      (entmakex
      (list '(0 . "INSERT")
            (cons 10
                  (mapcar (function (lambda (q p) (/ (+ q p) 2.)))
                            (setq p1 (cdr (assoc 10 e)))
                            (setq p2 (cdr (assoc 11 e)))
                  )
            )
            (cons 2 name)
            (cons 50 (angle p1 p2))
            '(41 . 1.0)
            '(42 . 1.0)
            '(43 . 1.0)
      )
      )
)
(princ)


;RESET SS1
(setq ss1 nil)
(setq ss1 (ssadd))

;FILTER SELECTION FOR LINES WITH LENGTH 1000 mm

(setq lung 1000)
(setq ss2 s)
(if ss2 (progn
(setq i 0ssl (sslength ss2))
(repeat ssl
(setq ename (ssname ss2 i))
(setq ll (distance (cdr (assoc 10 (entget ename))) (cdr (assoc 11 (entget ename)))))
(if (= lung ll)(ssadd ename ss1))
(setq i (1+ i))
)
(princ (strcat (itoa (sslength ss1)) " generated block's of 1000 mm."))
(sssetfirst nil ss1)
))
(princ)

;INSERT BLOCK IN MIDPOINT of 1000 mm

(setq name "100M")
(repeat (setq i (sslength ss1))
      (setq e (entget (ssname ss1 (setq i (1- i)))))
      (entmakex
      (list '(0 . "INSERT")
            (cons 10
                  (mapcar (function (lambda (q p) (/ (+ q p) 2.)))
                            (setq p1 (cdr (assoc 10 e)))
                            (setq p2 (cdr (assoc 11 e)))
                  )
            )
            (cons 2 name)
            (cons 50 (angle p1 p2))
            '(41 . 1.0)
            '(42 . 1.0)
            '(43 . 1.0)
      )
      )
)
(princ)

;RESET SS1
(setq ss1 nil)
(setq ss1 (ssadd))


)



 
以下是错误:
-它没有考虑沿XZ-YZ平面的线?我不明白为什么。
-这是一段很长的代码,我需要按长度插入10个或更多的块。优化例程的简单方法?
 
谢谢
米勒

Tharwat 发表于 2022-7-5 20:00:40

你能列出其余的区块名及其相关长度吗?

Miller87 发表于 2022-7-5 20:01:29

要在线路上关联的块列表:
长度为500 mm的线路中点处的“50M”->
长度为1000 mm的线路中点处的“100M”->
长度为1500 mm的线路中点处的“150M”->
长度为2000 mm的线路中点处的“200M”->
长度为2500 mm的线路中点处的“250M”->
长度为3000 mm的线路中点处的“300M”->

Tharwat 发表于 2022-7-5 20:06:51

试试这个,让我知道。
 
[未测试]
 

(defun c:Test(/ l ss)
;;;        Tharwat 27.4.2015        ;;;
(setq l '(("50M" 500)
         ("100M" 1000)
         ("150M" 1500)
         ("200M" 2000)
         ("250M" 2500)
         ("300M" 3000))
       )
(if (setq ss (ssget '((0 . "LINE"))))
   ((lambda (i / sn a b f)
      (while (setq sn (ssname ss (setq i (1+ i))))
      (if
          (and (vl-some
               '(lambda (x)
                  (equal
                      (distance
                        (setq a (cdr (assoc 10 (entget sn))))
                        (setq b (cdr (assoc 11 (entget sn)))))
                      (cadr (setq f x))
                      1e-)
               l)
               (tblsearch "BLOCK" (car f))
               )
         (entmake (list '(0 . "INSERT")(cons 10 (mapcar (function (lambda (q p) (/ (+ q p) 2.)))
                                                          a
                                                          b
                                                          ))
                        (cons 2 (car f))
                        (cons 50 (angle a b))
                        '(41 . 1.0)
                        '(42 . 1.0)
                        '(43 . 1.0)
                        )
                  ))))-1)
   )
(princ)
)

Miller87 发表于 2022-7-5 20:11:43

谢谢,很有效!
但我需要修改一下。
过滤垂直线Z的选择,并从选择中拒绝所有其他线。
再次感谢

Tharwat 发表于 2022-7-5 20:18:53

 
太好了,不客气
 
 
对不起,我没有领会你的意思。再进一步解释一下。

Miller87 发表于 2022-7-5 20:20:23

 
http://i.imgur.com/mlu73fc.png?1
 
在按距离过滤之前,我只想选择属于平面YZ XZ的垂直线(如图中红色所示)。
这可能吗?
谢谢

Tharwat 发表于 2022-7-5 20:26:17

我们可以迭代选择特定的行标准,如果匹配,让代码移动到其他标准来检查它。
 
你能上传那张样图吗?

Miller87 发表于 2022-7-5 20:32:49

 
给你。
红色竖线,长度为1000和1500。
样品图纸

Tharwat 发表于 2022-7-5 20:35:21

我认为你不能,因为白线的Z坐标也等于红线的起点/终点。
 
您可以通过按层/颜色过滤线条来解决此问题。。。等
页: [1] 2
查看完整版本: 在li的中点插入块