manddarran 发表于 2022-7-6 11:47:19

在一个

我试图编写一个lisp例程来自动选择天花板网格中点的中心。因此,当您在天花板网格的“框”中为该点选择一个点时,无论网格是否旋转,它都会在该网格点的死点插入一个块。
 
那么,在一个长方体中选取一个点,并返回该长方体的死点,无论旋转如何?
 
像泥一样清澈?我有一个这样做的网格是在0度运行。。。。。没有优化的代码,所以不要锤我。它适用于我们:-)
 

(defun c:MULT8 ()
(setq aper (getvar "aperture"))
(setvar "aperture" 50)
(command "setvar" "cmdecho" "0")
(if (= VALUE nil) (setq VALUE " "))
;   (setq q1 (strcat "\nWhat is attribute value? <" VALUE ">.."))
;   (setq OL VALUE VALUE (strcase (getstring q1)))
(if (= VALUE "") (setq VALUE OL))
(SETQ PT NIL)
(SETQ PT (GETPOINT))
(while (NOT (NULL PT))
   (setq newpt (osnap pt "int"))
   (if (/= newpt nil)
   (progn
   (setq angfound (rtd (angle newpt pt)))
   (cond
       (
      (and
         (> angfound 0)
         (< angfound 90)
      )
       (setq angins 45)
       )

       (
      (and
         (> angfound 90)
         (< angfound 180)
      )
       (setq angins 135)
       )


       (
      (and
         (> angfound 180)
         (< angfound 270)
      )
       (setq angins 225)
       )

       (
      (and
         (> angfound 270)
         (< angfound 360)
      )
       (setq angins 315)
       )

       (
       (= angfound 180)
      (setq angins 0)
       )
       (
       (= angfound 90)
      (setq angins 270)
       )
       (
       (= angfound 0)
      (setq angins 180)
       )
       (
       (= angfound 270)
      (setq angins 90)
       )
   )
   )
   )

(if (= newpt nil)
       (progn
       (setq newpt pt)
       (print "newpt")
       (command "insert" block newpt "" "" "")
       )
   (progn
   (print"past")
   
   (setq inpt (polar newpt (dtr angins) (sqrt 288)))
   (command "insert" block inpt "" "" "")
   )
   )
   


   



(COMMAND "SETVAR" "HIGHLIGHT" "1")
(SETQ PT NIL)
(SETQ PT (GETPOINT))
)
)

manddarran 发表于 2022-7-6 11:56:32

这里是一些网格图片

JohnM 发表于 2022-7-6 12:06:20

尝试使用-boundary命令(命令“-boundary”pt)
(setq pt getpoint)
(命令“-边界”pt)
(setq ent(entget(entlast))
现在获取相反的角点,并找到插入点的中点
(entdel(entlast))_删除边界

BIGAL 发表于 2022-7-6 12:11:08

另一种方法是使用CAL(int+int)/2.0
 
或者只是两个点中间的Lisp程序

manddarran 发表于 2022-7-6 12:20:34

感谢您的输入!如果广场上没有其他东西,边界就可以了。但很多时候里面可能有一扇门或一个房间的名字。我们可以把房间的名字关掉,但我尽量避免。

TimSpangler 发表于 2022-7-6 12:27:04

“mtp”或“m2p”(给你一个介于2点之间的点)
 
然后选择两个相对的角。

manddarran 发表于 2022-7-6 12:34:21

是的,我可以选择两点,但我的任务是选择一点。当网格为0和90度时,它工作正常,但当建筑师或建筑不是0和90度时,我不知所措。。。。。

manddarran 发表于 2022-7-6 12:46:00

好的,这就是我想到的。如果你被放大到很远的地方,它肯定很慢,但可以工作。
 
(defun c:headins ()
(SETQ PT NIL)
(SETQ PT (GETPOINT))
(while (NOT (NULL PT))
   (Command "-boundary" pt "")
   (setq item (entlast))
   ;convert to vl object
   (setq item (vlax-ename->vla-object item))
   ; (setq cPl (vlax-ename->vla-object(car(entlast))))
   (vla-GetBoundingBox item 'blPt 'trPt)
   (setq lPt(vlax-safearray->list blPt))
   (setq tPt(vlax-safearray->list trPt))
   (setq inspt (CAL "(lpt + tpt) / 2.0"))
   (entdel (entlast))
   (command "insert" block inspt "" "" "")
   (SETQ PTOLD PT)
   (SETQ PT NIL)
   (SETQ PT (GETPOINT))
)
)

manddarran 发表于 2022-7-6 12:48:20

这大大加快了速度。我创建了一个包含文本“grid”的所有层的边界选择集。
 
(defun c:headins ()
;(ssget gridl (ssget "_X" (list "GRID")))
(setq gridl (ssget "_X" '((8 . "GRID"))))
(SETQ PT NIL)
(SETQ PT (GETPOINT))
(while (NOT (NULL PT))
   (Command "-boundary" "a" "b" "n" (ssget "_X" '((8 . "*GRID*"))) "" "" pt "")
   (setq item (entlast))
   ;convert to vl object
   (setq item (vlax-ename->vla-object item))
   ; (setq cPl (vlax-ename->vla-object(car(entlast))))
   (vla-GetBoundingBox item 'blPt 'trPt)
   (setq lPt(vlax-safearray->list blPt))
   (setq tPt(vlax-safearray->list trPt))
   (setq inspt (CAL "(lpt + tpt) / 2.0"))
   (entdel (entlast))
   (command "insert" block inspt "" "" "")
   (SETQ PTOLD PT)
   (SETQ PT NIL)
   (SETQ PT (GETPOINT))
)
)
页: [1]
查看完整版本: 在一个