明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1299|回复: 8

[提问] 求一个圆变正方形的功能

[复制链接]
发表于 2016-3-6 10:32 | 显示全部楼层 |阅读模式
我这里有一个直径为1000的圆形,求输入命令tt,点击圆形变成边长为1000的正方形,中心相同
发表于 2016-3-6 11:24 | 显示全部楼层
  1. (defun c:tt (/ ss i cen rad a ent ename)
  2.   (if (setq ss (ssget '((0 . "circle"))))
  3.     (repeat (setq i (sslength ss))
  4.       (setq ename (ssname ss (setq i (1- i)))
  5.             ent   (entget ename)
  6.             cen   (cdr (assoc 10 ent))
  7.             rad   (cdr (assoc 40 ent))
  8.             a     (* rad (sqrt 2.0))
  9.       )
  10.       ;;(entdel ename)
  11.       (entmake (append (list '(0 . "LWPOLYLINE")
  12.                              '(100 . "AcDbEntity")
  13.                              '(100 . "AcDbPolyline")
  14.                              (assoc 8 ent)
  15.                              '(90 . 4)
  16.                              '(70 . 1)
  17.                        )
  18.                        (mapcar (function (lambda (pt) (cons 10 pt)))
  19.                                (mapcar (function (lambda (x) (polar cen x a )))
  20.                                        (list (* pi 0.25) (* pi 0.75) (* pi 1.25) (* pi 1.75))
  21.                                )
  22.                        )
  23.                )
  24.       )      
  25.     )
  26.   )
  27. )

发表于 2016-3-6 11:54 | 显示全部楼层
本帖最后由 ThinkerHua 于 2016-3-6 11:57 编辑
  1. (defun c:tt (/ engs_circle centerofcircle lengthofside p1 p2 p3 p4)
  2.   (setq engs_circle (entget (car (entsel "\n请选择需转换的圆:"))))
  3.   (setq centerofcircle (cdr (assoc 10 engs_circle)))
  4.   (setq lengthofside (cdr (assoc 40 engs_circle)))
  5.   (setq        p1 (polar centerofcircle
  6.                   (* pi 0.75)
  7.                   (/ lengthofside (sin (* pi 0.25)))
  8.            )
  9.   )
  10.   (setq        p2 (polar centerofcircle
  11.                   (* pi 0.25)
  12.                   (/ lengthofside (sin (* pi 0.25)))
  13.            )
  14.   )
  15.   (setq        p3 (polar centerofcircle
  16.                   (* pi 1.75)
  17.                   (/ lengthofside (sin (* pi 0.25)))
  18.            )
  19.   )
  20.   (setq        p4 (polar centerofcircle
  21.                   (* pi 1.25)
  22.                   (/ lengthofside (sin (* pi 0.25)))
  23.            )
  24.   )
  25.   (entmake (list '(0 . "LWPOLYLINE")
  26.                  '(100 . "AcDbEntity")
  27.                  '(100 . "AcDbPolyline")
  28.                  (cons 90 4)
  29.                  (cons 70 1)
  30.                  (cons 10 p1)
  31.                  (cons 10 p2)
  32.                  (cons 10 p3)
  33.                  (cons 10 p4)
  34.            )
  35.   )
  36.   (entdel (cdr (car engs_circle)))
  37.   (prin1)
  38. )
发表于 2016-3-7 10:32 | 显示全部楼层
  1. (defun c:tt (/ ss i ent)
  2.   (setvar "CMDECHO" 0)
  3.   (command ".UNDO" "BE")
  4.   (if (setq ss (ssget '((0 . "CIRCLE")))) (progn
  5.     (repeat (setq i (sslength ss))
  6.       (setq ent (entget (ssname ss (setq i (1- i)))))
  7.       (command "_.POLYGON" "4" (cdr (assoc 10 ent)) "C" (cdr (assoc 40 ent)))
  8.     )
  9.     (command "_.ERASE" ss "")
  10.   ))
  11.   (command ".UNDO" "E")
  12.   (setvar "CMDECHO" 1)
  13.   (princ)
  14. )
发表于 2016-3-9 22:34 | 显示全部楼层
ZZXXQQ 发表于 2016-3-7 10:32

简明扼要,我最喜欢这种分格了!
向大师致敬!
发表于 2016-3-12 19:34 | 显示全部楼层
  1. (defun c:tt (/ ss i s1 p0 rr p1 p2)
  2.   (if (setq ss (ssget '((0 . "circle"))))
  3.     (progn
  4.       (setq i -1)
  5.       (while (setq s1 (ssname ss (setq i (1+ i))))
  6.         (setq p0 (cdr (assoc 10 (entget s1)))
  7.               rr (cdr (assoc 40 (entget s1)))
  8.               p1 (list (- (car p0) rr) (- (cadr p0) rr))
  9.               p2 (list (+ (car p0) rr) (+ (cadr p0) rr))
  10.         )
  11.         (command "rectang" "non" p1 "non" p2)
  12.       )
  13.       (command "erase" ss "")
  14.     )
  15.   )
  16.   (princ)
  17. )
发表于 2016-3-13 09:11 | 显示全部楼层
本帖最后由 437271963 于 2016-3-13 09:53 编辑

VBA函数提取的坐标比较准确,法向坐标-1的也可以准确提取。
  1. (defun c:tes ( / &k1 &kw1 &ss1 pt1 pt2 pt3 pt4 tc1 x)
  2. (if (null vlax-dump-object) (vl-load-com) )
  3. (if (setq &kw1 (ssget '((0 . "CIRCLE"))));选择圆
  4.   (progn
  5.    (while (setq &k1 (ssname &kw1 0))
  6.     (setq &kw1 (ssdel &k1 &kw1))
  7.     (setq &k1 (vlax-ename->vla-object &k1));变VLA对象
  8.     (vla-GetBoundingBox &k1 'pt1 'pt2);计算包围盒
  9.     (setq tc1 (vla-get-layer &k1));得到图层
  10.     (vla-delete &k1);删除圆
  11.     (setq &ss1
  12.      (mapcar '(lambda (x) (list (car x) (cadr x)))
  13.      (mapcar 'vlax-safearray->list (list pt1 pt2))
  14.     );取得坐标
  15.     (setq pt1 (car &ss1)
  16.           pt3 (cadr &ss1)
  17.           pt2 (list (car pt1) (cadr pt3))
  18.           pt4 (list (car pt3) (cadr pt1)))
  19.           &ss1 (list pt1 pt2 pt3 pt4)
  20.     );计算得到4点坐标
  21.     (entmake
  22.      (append
  23.       (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 8 tc1) '(90 . 4) '(70 . 1) '(38 . 0))
  24.       (mapcar '(lambda (x) (cons 10 x)) &ss1)
  25.       );矩形的图层与圆相同,Z标高是0
  26.     );利用entmake函数绘制图形是最快的,不受捕捉影响
  27.    )
  28.   )
  29. )
  30. (princ)
  31. )
发表于 2016-3-14 13:02 | 显示全部楼层
ZZXXQQ 发表于 2016-3-7 10:32

用到COMMAND   给个差评
开个玩笑,Z大能力可是大大的
我也只能用COMMAND来写一些小程序
发表于 2016-3-24 18:55 | 显示全部楼层
ysq101 发表于 2016-3-14 13:02
用到COMMAND   给个差评
开个玩笑,Z大能力可是大大的
我也只能用COMMAND来写一些小程序

人家化繁为简
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 04:52 , Processed in 0.206734 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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