明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2874|回复: 12

[讨论] 求一个能画出三拐封闭多段线的lsp,求大神指导

[复制链接]
发表于 2017-12-1 09:24:12 | 显示全部楼层 |阅读模式
各位大神,现已有能画出两拐的代码,现想画出三拐的图元,该如何更改?有大神赐教下吗?,谢谢
两转的代码如下:
;转角----------------------------------------------------------------------
(defun c:3C (/ OLDOS p0 p1 P2 P3 P4 P5 p0x p0y p2x p2y x02i y02i pc tTmax);测量BC作文本
(COMMAND "UNDO" "BE")
(SETQ OLDOS(GETVAR "OSMODE"))
(SETQ OLDLN (GETVAR "CLAYER"))
(initget 1)
(setq p0 (getpoint "\nFirst Point:"))
(initget 33)
(setq p1 (getPOINT p0 "\nSecond Point:"))
(initget 33)
(setq p2 (getPOINT p1 "\nThird Point:"))
(SETQ P3 (POLAR P2 (- (ANGLE P1 P2) (/ PI 2)) 100))
(SETQ P5 (POLAR P0 (- (ANGLE P0 P1) (/ PI 2)) 100))
(SETQ P4 (INTERS P3 (POLAR P3 (ANGLE P2 P1) 65) P5 (POLAR P5 (ANGLE P0 P1) 65) NIL))
(SETQ p0x (NTH 0 P0))
(SETQ p0y (NTH 1 P0))
(SETQ p2x (NTH 0 P2))
(SETQ p2y (NTH 1 P2))
(SETQ x02i (- p2x p0x))
(SETQ y02i (- p2y p0y))
(SETQ ANG1 (ANGLE P0 P1))
(SETQ ANG2 (ANGLE P1 P2))
(SETQ DIST1 (distance p0 p1))
(SETQ DIST2 (distance p1 p2))
(if (and p0 p1 P2)
(progn
(setq ttmax (STRCAT "3C " (RTOS (distance p0 p1) 2 0) "+" (RTOS (distance p1 p2) 2 0)))
(SETVAR "OSMODE" 0)
(command "layer""m""03-LC" "c" "7" "03-LC" "")
(COMMAND "PLINE" P0 P1 P2 P3 P4 P5 "C")
(command "layer""m""03-LC-word" "c" "4" "03-LC-word" "")
(if (> (abs DIST1) (abs DIST2))
(PROGN
(setq pc (polar p0 (angle p0 p4) (/ (distance p0 p4) 2)))
(COMMAND "TEXT" "j" "m" pc "50" (* (/ ANG1 PI) 180) tTmax)
)
(PROGN
(setq pc (polar p4 (angle p4 p2) (/ (distance p4 p2) 2)))
(COMMAND "TEXT" "j" "m" pc "50" (* (/ ANG2 PI) 180) tTmax)
)
)
)
)
(SETVAR "OSMODE" OLDOS)
(SETVAR "CLAYER" OLDLN)
(COMMAND "UNDO" "E")
(PRINC)
)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2017-12-7 09:37:51 | 显示全部楼层
362928018 发表于 2017-12-6 22:47
高手啊,好厉害,能不能改下,
出来的图元是内侧的尺寸,能否变成外侧红色标注的尺寸? 附图

  1. (defun c:3C ( / OLDOS p0 p1 P2 P3 P4 P5 p6 p7 p8 p0x p0y p2x p2y x02i y02i pc tTmax)
  2. (COMMAND "UNDO" "BE")
  3. (SETQ OLDOS(GETVAR "OSMODE"))
  4. (SETQ OLDLN (GETVAR "CLAYER"))
  5. (initget 1)
  6. (setq p0 (getpoint "\n指定第一个点:"))
  7. (initget 33)
  8. (setq p1 (getPOINT p0 "\n指定第二个点:"))
  9. (initget 33)
  10. (setq p2 (getPOINT p1 "\n指定第三个点:"))
  11. (initget 33);设定下次getxxx函数的有效输入
  12. (setq p3 (getPOINT p2 "\n指定第四个点:"))

  13. (SETQ P4 (POLAR P3    (ANGLE P2 P1)   100))
  14. (SETQ P7 (POLAR P0 (ANGLE P2 P1)  100))
  15.   (setq p6 (polar p7  (ANGLE P0 P1) (+ 100
  16.                                                    (sqrt
  17.                                                      (+
  18.                                                        (*(- (nth 0 p0) (nth 0 p1))
  19.                                                          (- (nth 0 p0) (nth 0 p1))
  20.                                                          )
  21.                                                        (*(- (nth 1 p0) (nth 1 p1))
  22.                                                          (- (nth 1 p0) (nth 1 p1))
  23.                                                          )
  24.                                                        )
  25.                                                      )
  26.                                                    )))
  27.   (setq p5 (polar p6 (ANGLE P1 P2)  (sqrt
  28.                                                      (+
  29.                                                        (*(- (nth 0 p2) (nth 0 p1))
  30.                                                          (- (nth 0 p2) (nth 0 p1))
  31.                                                          )
  32.                                                        (*(- (nth 1 p2) (nth 1 p1))
  33.                                                          (- (nth 1 p2) (nth 1 p1))
  34.                                                          )
  35.                                                        )
  36.                                                      )
  37.                                                    ))
  38.   ;新增p8变量是为了给文字起点到左边
  39.   (SETQ P8 (POLAR P4    PI   2000))
  40. ;(SETQ P4 (INTERS P3 (POLAR P3 (ANGLE P2 P1) 65) P5 (POLAR P5 (ANGLE P0 P1) 75) NIL))
  41. ;(inters 1 2 3 4 模式)取得两条线的交点
  42. (SETQ p0x (NTH 0 P0))
  43. (SETQ p0y (NTH 1 P0))
  44. (SETQ p2x (NTH 0 P2))
  45. (SETQ p2y (NTH 1 P2))
  46. (SETQ x02i (- p2x p0x))
  47. (SETQ y02i (- p2y p0y))
  48. (SETQ ANG1 (ANGLE P0 P1))
  49. (SETQ ANG2 (ANGLE P1 P2))
  50. (SETQ DIST1 (distance p0 p1))
  51. (SETQ DIST2 (distance p1 p2))
  52. (if (and p0 p1 P2)
  53. (progn
  54. (setq ttmax (STRCAT "4C " (RTOS (distance p0 p1) 2 0) "+" (RTOS (distance p1 p2) 2 0) "+" (RTOS (distance p2 p3) 2 0)))
  55. (SETVAR "OSMODE" 0)
  56. (command "layer""m""03-LC" "c" "7" "03-LC" "")
  57. (COMMAND "PLINE" P0 P1 P2 P3 P4 P5 p6 p7 "C")
  58. ;以下程序用来新建一个红色图层,然后在红色图层上面标注
  59. (command "layer""m""03-LC-dim" "c" "1" "03-LC-dim" "")
  60. (command "dimlinear" p0 p1 (POLAR P0 (ANGLE P1 P2)  500))
  61. (command "dimlinear" p2 p1 (POLAR P1 (ANGLE P1 P0)  500))
  62. (command "dimlinear" p2 p3 (POLAR P2 (ANGLE P1 P2)  500))
  63. (command "dimlinear" p4 p5 (POLAR P4 (ANGLE P3 P4)  500))
  64. (command "dimlinear" p5 p6 (POLAR P5 (ANGLE P5 P4)  500))
  65. (command "dimlinear" p6 p7 (POLAR P6 (ANGLE P5 P6)  500))
  66. (command "layer""m""03-LC-word" "c" "4" "03-LC-word" "")
  67. (if (> (abs DIST1) (abs DIST2))
  68. (PROGN
  69. (setq pc (polar p0 (angle p0 p4) (/ (distance p0 p4) 2)))
  70. (COMMAND "TEXT" p8 "50"
  71.          "0"
  72.          tTmax)
  73. )
  74. (PROGN
  75. (setq pc (polar p4 (angle p4 p2) (/ (distance p4 p2) 2)))
  76. (COMMAND "TEXT" p8 "50"
  77.          "0"
  78.          tTmax)
  79. )
  80. )
  81. )
  82. )
  83.   
  84. (SETVAR "OSMODE" OLDOS)
  85. (SETVAR "CLAYER" OLDLN)
  86. (COMMAND "UNDO" "E")
  87. (PRINC)
  88. )
发表于 2017-12-6 14:05:01 | 显示全部楼层

(defun c:3C ( / OLDOS p0 p1 P2 P3 P4 P5 p0x p0y p2x p2y x02i y02i pc tTmax)
(COMMAND "UNDO" "BE")
(SETQ OLDOS(GETVAR "OSMODE"))
(SETQ OLDLN (GETVAR "CLAYER"))
(initget 1)
(setq p0 (getpoint "\n指定第一个点:"))
(initget 33)
(setq p1 (getPOINT p0 "\n指定第二个点:"))
(initget 33)
(setq p2 (getPOINT p1 "\n指定第三个点:"))
(initget 33);设定下次getxxx函数的有效输入
(setq p3 (getPOINT p2 "\n指定第四个点:"))

(SETQ P4 (POLAR P3    (ANGLE P2 P1)   100))
(SETQ P7 (POLAR P0 (ANGLE P2 P1)  100))
  (setq p6 (polar p7  (ANGLE P0 P1) (+ 100
                                                   (sqrt
                                                     (+
                                                       (*(- (nth 0 p0) (nth 0 p1))
                                                         (- (nth 0 p0) (nth 0 p1))
                                                         )
                                                       (*(- (nth 1 p0) (nth 1 p1))
                                                         (- (nth 1 p0) (nth 1 p1))
                                                         )
                                                       )
                                                     )
                                                   )))
  (setq p5 (polar p6 (ANGLE P1 P2)  (sqrt
                                                     (+
                                                       (*(- (nth 0 p2) (nth 0 p1))
                                                         (- (nth 0 p2) (nth 0 p1))
                                                         )
                                                       (*(- (nth 1 p2) (nth 1 p1))
                                                         (- (nth 1 p2) (nth 1 p1))
                                                         )
                                                       )
                                                     )
                                                   ))
;(SETQ P4 (INTERS P3 (POLAR P3 (ANGLE P2 P1) 65) P5 (POLAR P5 (ANGLE P0 P1) 75) NIL))
;(inters 1 2 3 4 模式)取得两条线的交点
(SETQ p0x (NTH 0 P0))
(SETQ p0y (NTH 1 P0))
(SETQ p2x (NTH 0 P2))
(SETQ p2y (NTH 1 P2))
(SETQ x02i (- p2x p0x))
(SETQ y02i (- p2y p0y))
(SETQ ANG1 (ANGLE P0 P1))
(SETQ ANG2 (ANGLE P1 P2))
(SETQ DIST1 (distance p0 p1))
(SETQ DIST2 (distance p1 p2))
(if (and p0 p1 P2)
(progn
(setq ttmax (STRCAT "4C " (RTOS (distance p0 p1) 2 0) "+" (RTOS (distance p1 p2) 2 0) "+" (RTOS (distance p2 p3) 2 0)))
(SETVAR "OSMODE" 0)
(command "layer""m""03-LC" "c" "7" "03-LC" "")
(COMMAND "PLINE" P0 P1 P2 P3 P4 P5 p6 p7 "C")
(command "layer""m""03-LC-word" "c" "4" "03-LC-word" "")
(if (> (abs DIST1) (abs DIST2))
(PROGN
(setq pc (polar p0 (angle p0 p4) (/ (distance p0 p4) 2)))
(COMMAND "TEXT" "j" "m" pc "50" (* (/ ANG1 PI) 180) tTmax)
)
(PROGN
(setq pc (polar p4 (angle p4 p2) (/ (distance p4 p2) 2)))
(COMMAND "TEXT" "j" "m" pc "50" (* (/ ANG2 PI) 180) tTmax)
)
)
)
)
(SETVAR "OSMODE" OLDOS)
(SETVAR "CLAYER" OLDLN)
(COMMAND "UNDO" "E")
(PRINC)
)
 楼主| 发表于 2017-12-6 22:47:27 | 显示全部楼层
bzhyong 发表于 2017-12-6 14:10
我也是刚开始学习。弄了三四个小时才弄好,希望能帮到你

高手啊,好厉害,能不能改下,
出来的图元是内侧的尺寸,能否变成外侧红色标注的尺寸? 附图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2017-12-1 09:36:03 | 显示全部楼层
有大神帮忙优化下吗

点评

4点画pline线,偏移100  发表于 2017-12-1 23:46
 楼主| 发表于 2017-12-2 16:00:49 | 显示全部楼层
362928018 发表于 2017-12-1 09:36
有大神帮忙优化下吗

谢谢xyp1964版主的解答,我初学LISP,好多看不懂,能帮忙修改下吗?
发表于 2017-12-2 19:40:49 | 显示全部楼层
362928018 发表于 2017-12-2 16:00
谢谢xyp1964版主的解答,我初学LISP,好多看不懂,能帮忙修改下吗?

;; 也许是你的意思

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2017-12-5 13:57:52 | 显示全部楼层
xyp1964 发表于 2017-12-2 19:40
;; 也许是你的意思

命令: TT ; 错误: no function definition: XYP-STARTSC  提示错误,用不了,能再看看是哪里出问题吗?
 楼主| 发表于 2017-12-5 14:01:10 | 显示全部楼层
xyp1964 发表于 2017-12-2 19:40
;; 也许是你的意思

能在之前我提供的加入第四点的代码吗?
发表于 2017-12-6 14:10:08 | 显示全部楼层
我也是刚开始学习。弄了三四个小时才弄好,希望能帮到你
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 19:05 , Processed in 0.202955 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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