这应包括旋转和点添加:
- (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))
|