大型复杂表格LISP nee
我一直在与李·麦克合作,他为我创建了一个lisp,用一系列阵列圆填充一个圆,并在每个阵列圆中放置6个点,这是一个了不起的工作:D。我现在需要创建一个lisp(或修改现有的lisp),该lisp将为我创建一个表(在Excel或Acad中),显示到这些点的距离。
我创建了一个示例,说明了我所描绘的桌子的样子,以及需要的距离。
我意识到这是一项艰巨的工作,我将永远感谢任何能帮助我(我们)完成这个项目的人。到目前为止,我已经附上了我所有的东西。提前感谢您抽出时间。
edm帮助v2。lsp
表帮助示例。图纸
示例表。拉链 纽盖,
只要看看你的要求,你想从0度或90度作为基点排列的圆圈。
此时,您会注意到所有圆都以0度对齐,并从那里围绕圆均匀分布。
你喜欢90度的角度吗?
李 我不知道你的意思,我知道你到目前为止所做的是完美的。我现在只需要一个表格来生成和帮助组织距离。你能贴张照片吗? 给这张桌子拍一张照片,我会贴一张我的意思的照片
(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))
文件保存在与图形相同的位置。 目前我们有:
您希望圆圈的排列方式如下:
哦,是的,90度会更好。谢谢,我没听懂。他通常是在90度角进入角色。这一点很好。 但是LISP#4中的当前表可以吗? 是的!:哈哈:太棒了!这张桌子看起来很完美!EDM操作员兴奋。他说,每次完成这种工作,你至少节省了一整天的工作。这是一年中的好几次。你还要把它旋转90度吗?我还注意到,阵列圆的中心点不再显示在图形中。这根本不是什么大问题,因为我们可以使用该表提取可能需要的任何距离,但如果不困难,并且只有在不困难的情况下,才能将点添加回阵列圆的中心?这样,如果我需要从一个中心到另一个中心进行测量,我可以简单地使用DISTANCE命令,而不是使用表中的数据进行一些trig。再说一次,这没什么大不了的,所以不要让自己失望,你做得很好D
太好了-我很高兴你想要它
我来看看是否可以将基“向量”旋转90度,添加中心点一点也不麻烦(如果可以的话,大约1/2行代码)。
干杯
李 这应包括旋转和点添加:
(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