明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1806|回复: 9

2002版画云线LISP

[复制链接]
发表于 2010-11-1 10:50:00 | 显示全部楼层 |阅读模式

我想封闭末点和起点,不能封闭。请高手帮忙看看程序错在哪儿?

(defun c:yx()

(setvar "cmdecho" 0)
 (setq d1 0)

(setq pt (getpoint "\n起点:"))
 (setq pttt pt)
(while pt
(setq pt1 (getpoint pt "\n下一点:"))

 

 
(if ( = d1 0)
  (setq d1 (distance pt pt1))
)

 (if(= pt1 pttt)                           
  (setq d1 (distance pt pt1))
  )

 
  (setq d2 (/ d1 (sqrt 3)))
  (setq ang1 (angle pt pt1))
  (setq ang (+ ang1 (/ pi 6)))
 
 
  (setq pty (polar pt ang d2))
 
  (setq ptx (polar pt ang1 d1))
 
 
(command "arc" pt pty ptx   "")
(setvar "osmode" 695)
  (setq pt ptx)
 
)
 
  (setvar "cmdecho" 1)

(prin1)
)
 

发表于 2010-11-1 20:52:00 | 显示全部楼层
(defun c:yx()
 (setvar "cmdecho" 0)
 (setq d1 0)
 (setq pt (getpoint "\n起点:"))
 (setq pttt pt)
 (while pt
  (setq pt1 (getpoint pt "\n下一点:"))
  (if (= d1 0) (setq d1 (distance pt pt1)))
  (if (equal (diatance pt1 pttt) 0.0 0.001) (setq d1 (distance pt pt1)))
  (setq d2 (/ d1 (sqrt 3)))
  (setq ang1 (angle pt pt1))
  (setq ang (+ ang1 (/ pi 6)))
  (setq pty (polar pt ang d2))
  (setq ptx (polar pt ang1 d1))
  (command "arc" pt pty ptx)
  (setvar "osmode" 695)
  (setq pt ptx)
  (if (equal (diatance pt1 pttt) 0.0 0.001) (setq pt nil))
 )
 (setvar "cmdecho" 1)
 (prin1)
)
 楼主| 发表于 2010-11-2 10:16:00 | 显示全部楼层

发现老大的也不能用,发现  diatance 应为  distance  ,谢谢老大

 楼主| 发表于 2010-11-2 10:44:00 | 显示全部楼层

另外再提个问题,能不能把画的云线变成一个块,这样删除的时候方便。

发表于 2010-11-2 22:21:00 | 显示全部楼层

变成复线行吗?

 楼主| 发表于 2010-11-3 16:17:00 | 显示全部楼层

只要是一个块,删除方便就行。谢谢。复线也不会占多大空间的。

发表于 2010-11-3 19:39:00 | 显示全部楼层
;;;连成多段线
  1. (defun c:yx()
  2. (setvar "cmdecho" 0)
  3.   (setq en (entlast))
  4. (setq d1 0)
  5. (setq pt (getpoint "\n起点:"))
  6. (setq pttt pt)
  7. (while pt
  8.   (setq pt1 (getpoint pt "\n下一点:"))
  9.   (if (= d1 0) (setq d1 (distance pt pt1)))
  10.   (if (equal (distance pt1 pttt) 0.0 0.001) (setq d1 (distance pt pt1)))
  11.   (setq d2 (/ d1 (sqrt 3)))
  12.   (setq ang1 (angle pt pt1))
  13.   (setq ang (+ ang1 (/ pi 6)))
  14.   (setq pty (polar pt ang d2))
  15.   (setq ptx (polar pt ang1 d1))
  16.   (command "arc" pt pty ptx)
  17.   (setvar "osmode" 695)
  18.   (setq pt ptx)
  19.   (if (equal (distance pt1 pttt) 0.0 0.001) (setq pt nil))
  20. )
  21.     (setq ss (ssadd))
  22.   (while (setq ent1 (entnext en))
  23.     (ssadd ent1 ss)
  24.     (setq en ent1)
  25.     )
  26.   
  27.   
  28.   (if (>  (sslength ss) 0) (command "pedit" (entlast) "y" "j" ss "" ""))
  29. (setvar "cmdecho" 1)
  30. (prin1)
  31. )
发表于 2010-11-3 21:04:00 | 显示全部楼层
;;;接近CAD自带云线功能,不带自动翻转功能
  1. (defun c:yx()
  2. (setvar "cmdecho" 0)
  3.   (setq en (entlast))
  4. (setq d1 0)
  5.   
  6.   (setq R (/ (getvar "viewsize") 10))
  7.   (princ "默认弧长:R=")
  8.   (princ R)
  9.   (while (= "A" (progn
  10.   (initget "A  ")
  11. (setq pt (getpoint "\n[弧长<A>/起点:"))
  12.   )
  13.      )
  14.     (initget 7)
  15.     (setq R (getreal "输入弧长:"))
  16.     )
  17. (setq pttt pt pd t)
  18.   
  19. (while pd
  20.    (while (progn
  21.                   (setq gr (grread T 1))
  22.     (if (= (car gr) 5)
  23.       (progn
  24.       (setq pt1 (cadr gr));setq
  25.       (< (distance pt1 pt) R)
  26.       );progn
  27.       t
  28.   
  29.          );progn
  30.   )
  31.     )
  32.    (if (< (distance pt1 pttt) R)
  33.      (setq pt1 pttt
  34.     pd nil)
  35.      )
  36.    (setq d1 (distance pt pt1))
  37.   (setq d2 (/ d1 (sqrt 3)))
  38.   (setq ang1 (angle pt pt1))
  39.   (setq ang (+ ang1 (/ pi 6)))
  40.   (setq pty (polar pt ang d2))
  41.   (setq ptx (polar pt ang1 d1))
  42.   (command "arc" pt pty ptx)
  43.   (setvar "osmode" 695)
  44.   (setq pt ptx)
  45. )
  46.     (setq ss (ssadd))
  47.   (while (setq ent1 (entnext en))
  48.     (ssadd ent1 ss)
  49.     (setq en ent1)
  50.     )
  51.   
  52.   
  53.   (if (>  (sslength ss) 0) (command "pedit" (entlast) "y" "j" ss "" ""))
  54. (setvar "cmdecho" 1)
  55. (prin1)
  56. )
发表于 2010-11-4 14:09:00 | 显示全部楼层
本帖最后由 作者 于 2010-11-5 12:32:18 编辑

再改了改,已接近CAD自带的云线功能,可自动判断圆弧方向,并自动翻转!
  1. (defun c:yx(/ plist returnLwpoly en ss pd gr pt pt0 pt1 pttt d1 d2 ptx pty R ang ang1 ent1)
  2. (defun gxl-clock (plist / k n count p0 p1 p2 x0 y0 x1 y1 x2 y2)
  3.   
  4.   (setq k (length plist)
  5. n 0
  6. count 0)
  7.   (if (> k 2)
  8.     (repeat (- k 2)
  9.       (setq p0 (nth n plist)
  10.      p1 (nth (1+ n) plist)
  11.      p2 (nth (+ n 2) plist)
  12.      )
  13.       (setq x0 (car p0)
  14.      y0 (cadr p0)
  15.      x1 (car p1)
  16.      y1 (cadr p1)
  17.      x2 (car p2)
  18.      y2 (cadr p2)
  19.      )
  20.       (setq rtn (- (* (- x1 x0) (- y2 y1)) (* (- y1 y0) (- x2 x1))))
  21.       (if (> rtn 0) (setq count (1+ count))(setq count (1- count)))
  22.       (setq n (1+ n))
  23.       
  24.       )
  25.     )
  26.   (if (> count 0) t nil)
  27.   )
  28.   (defun returnLwpoly (ent / New enl)
  29.   (setq enl (entget ent))
  30.   (foreach a enl
  31.     (if (= 42 (car a))
  32.       (progn
  33. (setq new (append new (list (cons 42 (* -1 (cdr a))))))
  34. )
  35.       (setq new (append new (list a)))
  36.       )
  37.     )
  38.   (entmod new)
  39.   )
  40. (setvar "cmdecho" 0)
  41.   (setq oldosmode (getvar "osmode"))
  42.   (setvar "osmode" 0)
  43.    (setq en (entlast))
  44. (setq d1 0)
  45.   
  46.   (setq R (/ (getvar "viewsize") 30))
  47.   (princ "\n默认弧长:R=")
  48.   (princ R)
  49.   (while (= "A" (progn
  50.   (initget "A  ")
  51. (setq pt (getpoint "\n[弧长<A>/起点:"))
  52.   
  53.   )
  54.      )
  55.     (initget 7)
  56.     (setq R (getreal "\n输入弧长:"))
  57.     )
  58.    (setq plist (cons pt plist))
  59. (setq pttt pt pd t pt0 pt)
  60.   ;;;
  61.    (command "pline" pttt "a")
  62.    ;;;
  63. (while pd
  64.    (while (progn
  65.                   (setq gr (grread T 1))
  66.     (if (= (car gr) 5)
  67.       (progn
  68.       (setq pt1 (cadr gr));setq
  69.       (< (distance pt1 pt) R)
  70.       );progn
  71.       t
  72.   
  73.          );progn
  74.   )
  75.     )
  76. (setq pt1 (polar pt0 (angle pt0 pt1 r)))
  77.    (if (< (distance pt1 pttt) r)
  78.      (setq pt1 pttt
  79.     pd nil)
  80.      )
  81. (setq pt0 pt1)
  82.    (setq plist (cons pt1 plist))
  83.    (setq d1 (distance pt pt1))
  84.   (setq d2 (/ d1 (sqrt 3)))
  85.   (setq ang1 (angle pt pt1))
  86.   (setq ang (+ ang1 (/ pi 6)))
  87.   (setq pty (polar pt ang d2))
  88.   (setq ptx (polar pt ang1 d1))
  89.   ;(command "arc" pt pty ptx)
  90.    (command "s"  pty ptx)
  91.   (setq pt ptx)
  92. )
  93.    (command "")
  94.    
  95.   (setq en (entlast))
  96.   (setq plist (reverse plist))
  97.    (if (gxl-clock plist) (returnLwpoly en))
  98.     (setvar "cmdecho" 1)
  99.   (setvar "osmode" oldosmode)
  100. (prin1)
  101. )
 楼主| 发表于 2010-11-4 15:38:00 | 显示全部楼层

哇,高手真多,很好用,谢谢~

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-2 14:34 , Processed in 0.182546 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表