TheNewGuy 发表于 2022-7-6 14:32:47

大型复杂表格LISP nee

我一直在与李·麦克合作,他为我创建了一个lisp,用一系列阵列圆填充一个圆,并在每个阵列圆中放置6个点,这是一个了不起的工作:D。
 
我现在需要创建一个lisp(或修改现有的lisp),该lisp将为我创建一个表(在Excel或Acad中),显示到这些点的距离。
 
我创建了一个示例,说明了我所描绘的桌子的样子,以及需要的距离。
 
我意识到这是一项艰巨的工作,我将永远感谢任何能帮助我(我们)完成这个项目的人。到目前为止,我已经附上了我所有的东西。提前感谢您抽出时间。
edm帮助v2。lsp
表帮助示例。图纸
示例表。拉链

Lee Mac 发表于 2022-7-6 14:38:59

纽盖,
 
只要看看你的要求,你想从0度或90度作为基点排列的圆圈。
 
此时,您会注意到所有圆都以0度对齐,并从那里围绕圆均匀分布。
 
你喜欢90度的角度吗?
 

TheNewGuy 发表于 2022-7-6 14:40:57

我不知道你的意思,我知道你到目前为止所做的是完美的。我现在只需要一个表格来生成和帮助组织距离。你能贴张照片吗?

Lee Mac 发表于 2022-7-6 14:44:00

给这张桌子拍一张照片,我会贴一张我的意思的照片
 

(defun c:cCut(/ doc spc ofile cCnt tNum col row tmp1 tmp2
               tmp3 tmp4 bsRad cCen cNum cAng i cPt AbcPt
               theta cPtlst AbRefpt InRefpt)
(vl-load-com)

(setq doc (vla-get-ActiveDocument (vlax-get-Acad-Object))
       spc (if (zerop (vla-get-activespace doc))
             (if (= (vla-get-mspace doc) :vlax-true)
               (vla-get-modelspace doc)
               (vla-get-paperspace doc))
             (vla-get-modelspace doc)))

(setvar "PDMODE" 3)      ; Point Style
(setvar "PDSIZE" 0.01)   ; Point Size

;; Default Retrieval

(or cut:out (setq cut:out 0.05))
(or cut:spc (setq cut:spc 0.007))
(or cut:row (setq cut:row 0.02))
(or cut:cir (setq cut:cir 0.125))

;; Circle Selection

(if (and (setq cEnt (car (entsel "\nSelect Base Circle: ")))
          (eq "CIRCLE" (cdr (assoc 0 (entget cEnt)))))
   (progn
   (setq ofile (open
                   (strcat (getvar "DWGPREFIX")
                           (substr (getvar "DWGNAME") 1
                                 (- (strlen (getvar "DWGNAME")) 4)) ".csv") "w")
         cCnt 0. tNum 0. col 1 row 1)

   ;; User Input
   
   (initget 4)
   (setq tmp1 (getreal (strcat "\nSpecify Spacing from Edge <" (rtos cut:out) "> : ")))
   (or (not tmp1) (setq cut:out tmp1))
   (initget 4)
   (setq tmp2 (getreal (strcat "\nSpecify Circle Spacing <" (rtos cut:spc) "> : ")))
   (or (not tmp2) (setq cut:spc tmp2))
   (initget 4)
   (setq tmp3 (getreal (strcat "\nSpecify Row Spacing <" (rtos cut:row) "> : ")))
   (or (not tmp3) (setq cut:row tmp3))
   (initget 6)
   (setq tmp4 (getreal (strcat "\nSpecify Inner Circle Radius <" (rtos cut:cir) "> : ")))
   (or (not tmp4) (setq cut:cir tmp4))
   
   (setq bsRad (- (cdr (assoc 40 (entget cEnt))) cut:out cut:cir)
         cCen(cdr (assoc 10 (entget cEnt))))

   ;; Main Loop
   
   (while (and (not (minusp bsRad))
               (< cut:cir bsRad))
      
       (setq cNum (fix (/ (* 2 pi bsRad) (+ (* 2 cut:cir) cut:spc)))
             cAng (/ (* 2 pi) cNum)
             i    0)

       ;; Secondary Loop
      
       (while (< i cNum)
         (write-line "CIRCLE,X ABS,Y ABS" ofile)
         (vla-put-color
         (vla-addCircle spc
             (vlax-3D-point
               (setq cPt (polar cCen (* i cAng) bsRad))) cut:cir) col)
         (setq tNum (1+ tNum) cCnt (1+ cCnt) AbcPt (mapcar '- cPt cCen))
         (write-line (strcat (itoa row) "--" (rtos cCnt 2 0) (chr 44)
                           (rtos (car AbcPt)) (chr 44) (rtos (cadr AbcPt))) ofile)
         (write-line "POINTS,X ABS,Y ABS,X INC,Y INC" ofile)
         (setq theta (atan
                     (/ (/ 0.025 cut:cir)
                        (sqrt
                            (- 1. (expt (/ 0.025 cut:cir) 2))))))
         (foreach x (setq cPtlst
                           (list (cons "A" (polar cPt (* i cAng) cut:cir))
                                 (cons "B" (polar cPt (- (* i cAng) (/ (+ pi cAng) 2.)) cut:cir))
                                 (cons "C" (polar cPt (+ (* i cAng) pi theta) cut:cir))
                                 (cons "D" (polar cPt (- (+ (* i cAng) pi) theta) cut:cir))
                                 (cons "E" (polar cPt (+ (* i cAng) (/ (+ pi cAng) 2.)) cut:cir))))
         (vla-addPoint spc (vlax-3D-point (cdr x)))
         (setq AbRefpt (mapcar '- (cdr x) cCen)
               InRefpt (mapcar '- (cdr x) cPt))
         (write-line (strcat (car x) (chr 44) (rtos (car AbRefpt)) (chr 44)
                               (rtos (cadr AbRefpt)) (chr 44) (rtos (car InRefpt))
                               (chr 44) (rtos (cadr InRefpt))) ofile))
         (setq i (1+ i)))
   
       (setq bsRad (- bsRad (* 2 cut:cir) cut:row) col (abs (- col 3)) row (1+ row) cCnt 0.))
   
   (princ (strcat "\n<< Number of Circles: " (rtos tNum 2 0) " >>"))                  
   (close ofile))
   (princ "\n<!> Incorrect Selection <!>"))
(princ))

 
文件保存在与图形相同的位置。

Lee Mac 发表于 2022-7-6 14:45:34

目前我们有:
 

 
 
您希望圆圈的排列方式如下:
 

TheNewGuy 发表于 2022-7-6 14:49:03

哦,是的,90度会更好。谢谢,我没听懂。他通常是在90度角进入角色。这一点很好。

Lee Mac 发表于 2022-7-6 14:52:50

但是LISP#4中的当前表可以吗?

TheNewGuy 发表于 2022-7-6 14:56:50

是的!:哈哈:太棒了!这张桌子看起来很完美!EDM操作员兴奋。他说,每次完成这种工作,你至少节省了一整天的工作。这是一年中的好几次。你还要把它旋转90度吗?我还注意到,阵列圆的中心点不再显示在图形中。这根本不是什么大问题,因为我们可以使用该表提取可能需要的任何距离,但如果不困难,并且只有在不困难的情况下,才能将点添加回阵列圆的中心?这样,如果我需要从一个中心到另一个中心进行测量,我可以简单地使用DISTANCE命令,而不是使用表中的数据进行一些trig。再说一次,这没什么大不了的,所以不要让自己失望,你做得很好D

Lee Mac 发表于 2022-7-6 14:59:47

 
太好了-我很高兴你想要它
 
 
我来看看是否可以将基“向量”旋转90度,添加中心点一点也不麻烦(如果可以的话,大约1/2行代码)。
 
干杯
 

Lee Mac 发表于 2022-7-6 15:04:05

这应包括旋转和点添加:
 

(defun c:cCut(/ doc spc ofile cCnt tNum col row tmp1 tmp2
               tmp3 tmp4 bsRad cCen cNum cAng i cPt AbcPt
               theta cPtlst AbRefpt InRefpt)
(vl-load-com)

(setq doc (vla-get-ActiveDocument (vlax-get-Acad-Object))
       spc (if (zerop (vla-get-activespace doc))
             (if (= (vla-get-mspace doc) :vlax-true)
               (vla-get-modelspace doc)
               (vla-get-paperspace doc))
             (vla-get-modelspace doc)))

(setvar "PDMODE" 3)      ; Point Style
(setvar "PDSIZE" 0.01)   ; Point Size

;; Default Retrieval

(or cut:out (setq cut:out 0.05))
(or cut:spc (setq cut:spc 0.007))
(or cut:row (setq cut:row 0.02))
(or cut:cir (setq cut:cir 0.125))

;; Circle Selection

(if (and (setq cEnt (car (entsel "\nSelect Base Circle: ")))
          (eq "CIRCLE" (cdr (assoc 0 (entget cEnt)))))
   (progn
   (setq ofile (open
                   (strcat (getvar "DWGPREFIX")
                           (substr (getvar "DWGNAME") 1
                                 (- (strlen (getvar "DWGNAME")) 4)) ".csv") "w")
         cCnt 0. tNum 0. col 1 row 1)

   ;; User Input
   
   (initget 4)
   (setq tmp1 (getreal (strcat "\nSpecify Spacing from Edge <" (rtos cut:out) "> : ")))
   (or (not tmp1) (setq cut:out tmp1))
   (initget 4)
   (setq tmp2 (getreal (strcat "\nSpecify Circle Spacing <" (rtos cut:spc) "> : ")))
   (or (not tmp2) (setq cut:spc tmp2))
   (initget 4)
   (setq tmp3 (getreal (strcat "\nSpecify Row Spacing <" (rtos cut:row) "> : ")))
   (or (not tmp3) (setq cut:row tmp3))
   (initget 6)
   (setq tmp4 (getreal (strcat "\nSpecify Inner Circle Radius <" (rtos cut:cir) "> : ")))
   (or (not tmp4) (setq cut:cir tmp4))
   
   (setq bsRad (- (cdr (assoc 40 (entget cEnt))) cut:out cut:cir)
         cCen(cdr (assoc 10 (entget cEnt))))

   ;; Main Loop
   
   (while (and (not (minusp bsRad))
               (< cut:cir bsRad))
      
       (setq cNum (fix (/ (* 2 pi bsRad) (+ (* 2 cut:cir) cut:spc)))
             cAng (/ (* 2 pi) cNum)
             i    0)

       ;; Secondary Loop
      
       (while (< i cNum)
         (write-line "CIRCLE,X ABS,Y ABS" ofile)
         (vla-put-color
         (vla-addCircle spc
             (vlax-3D-point
               (setq cPt (polar cCen (+ (/ pi 2.) (* i cAng)) bsRad))) cut:cir) col)
         (vla-addPoint spc (vlax-3D-point cPt))
         (setq tNum (1+ tNum) cCnt (1+ cCnt) AbcPt (mapcar '- cPt cCen))
         (write-line (strcat (itoa row) "--" (rtos cCnt 2 0) (chr 44)
                           (rtos (car AbcPt)) (chr 44) (rtos (cadr AbcPt))) ofile)
         (write-line "POINTS,X ABS,Y ABS,X INC,Y INC" ofile)
         (setq theta (atan
                     (/ (/ 0.025 cut:cir)
                        (sqrt
                            (- 1. (expt (/ 0.025 cut:cir) 2))))))
         (foreach x (setq cPtlst
                           (list (cons "A" (polar cPt (+ (/ pi 2) (* i cAng)) cut:cir))
                                 (cons "B" (polar cPt (+ (/ pi 2) (- (* i cAng) (/ (+ pi cAng) 2.))) cut:cir))
                                 (cons "C" (polar cPt (+ (/ pi 2) (* i cAng) pi theta) cut:cir))
                                 (cons "D" (polar cPt (+ (/ pi 2) (- (+ (* i cAng) pi) theta)) cut:cir))
                                 (cons "E" (polar cPt (+ (/ pi 2) (* i cAng) (/ (+ pi cAng) 2.)) cut:cir))))
         (vla-addPoint spc (vlax-3D-point (cdr x)))
         (setq AbRefpt (mapcar '- (cdr x) cCen)
               InRefpt (mapcar '- (cdr x) cPt))
         (write-line (strcat (car x) (chr 44) (rtos (car AbRefpt)) (chr 44)
                               (rtos (cadr AbRefpt)) (chr 44) (rtos (car InRefpt))
                               (chr 44) (rtos (cadr InRefpt))) ofile))
         (setq i (1+ i)))
   
       (setq bsRad (- bsRad (* 2 cut:cir) cut:row) col (abs (- col 3)) row (1+ row) cCnt 0.))
   
   (princ (strcat "\n<< Number of Circles: " (rtos tNum 2 0) " >>"))                  
   (close ofile))
   (princ "\n<!> Incorrect Selection <!>"))
(princ))
页: [1] 2
查看完整版本: 大型复杂表格LISP nee