明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1792|回复: 7

[已解答] 如果在执行程序(挪圆)前,将直线Z坐标归0?

[复制链接]
发表于 2013-12-19 21:27:30 | 显示全部楼层 |阅读模式
5明经币
(defun c:ny(/ center circle index lineobj point point_01 point_02 pointlist sscircle ssline syh temp varvalue)
(vl-load-com)
(setvar "cmdecho" 0)
(princ "\n请选取要处理的直线对象")
(setq ssLine (ssget '((0 . "LINE"))))
(if (/= ssLine nil)
  (progn (setq syh 0)
   (vl-cmdf ".zoom" "e")
   (repeat (sslength ssLine)
    (setq LineObj (vlax-ename->vla-object (ssname ssLine syh)))
    (setq Point_01 (vlax-get LineObj 'StartPoint))
    (setq Point_02 (vlax-get LineObj 'EndPoint))
    (setq ssCircle (ssget "f" (list Point_01 Point_02) '((0 . "CIRCLE"))))
    (if (/= ssCircle nil)
     (progn (setq index 0)
      (repeat (sslength ssCircle)
       (setq Circle (vlax-ename->vla-object (ssname ssCircle index)))
       (setq Center (vlax-get Circle 'Center))
       (setq VarValue (vlax-variant-value (vlax-invoke-method LineObj 'IntersectWith Circle acExtendNone)))
       (setq PointList (vl-catch-all-apply 'vlax-safearray->list (list VarValue)))
       (if (not (vl-catch-all-error-p PointList))
        (cond ((= (length PointList) 3)
          (if (< (distance Center Point_01)(distance Center Point_02))
           (vl-catch-all-apply 'vlax-put (list Circle 'Center Point_01))
           (vl-catch-all-apply 'vlax-put (list Circle 'Center Point_02))
          )
         )
         ((= (length PointList) 6)
          (progn (setq Point (list (* (+ (nth 0 PointList)(nth 3 PointList)) 0.5)(* (+ (nth 1 PointList)(nth 4 PointList)) 0.5) (caddr Center)))
           (vl-catch-all-apply 'vlax-put (list Circle 'Center Point))
          )
         )
        )
       )
       (setq index (+ index 1))
      )
     )
    )
    (setq syh (+ syh 1))
   )
   (vl-cmdf ".zoom" "p")
   (alert "完成!")
  )
)
(princ)
)

这是原程序,如何在执行前将直线的Z坐标归0?谁能修改一下添加此功能,谢谢!!
附件: 您需要 登录 才可以下载或查看,没有账号?注册
发表于 2013-12-19 21:27:31 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-12-20 22:45 编辑

  1. (defun c:ny(/ center circle index lineobj point point_01 point_02 radius ssline syh)
  2.   (vl-load-com)
  3.   (setvar "cmdecho" 0)
  4.   (princ "\n请选取要处理的直线对象")
  5.   (if(setq ssLine (ssget '((0 . "LINE"))))
  6.     (progn (setq syh 0)
  7.       (vl-cmdf ".zoom" "e")
  8.       (repeat (sslength ssLine)
  9. (entmod(setq LineObj(ssname ssLine syh)syh(1+ syh)
  10.        point(entget LineObj)
  11.        LineObj(vlax-ename->vla-object LineObj)
  12.        Point_01(cdr(assoc 10 point))
  13.        Point_01(list(car Point_01)(cadr Point_01)0)
  14.        Point_02(cdr(assoc 11 point))
  15.        Point_02(list(car Point_02)(cadr Point_02)0)
  16.        point(subst(cons 10 Point_01)(assoc 10 point)point)
  17.        point(subst(cons 11 Point_02)(assoc 11 point)point)))
  18. (if(setq ssCircle(ssget"F"(list Point_01 Point_02)'((0 . "CIRCLE"))))
  19.    (progn (setq index 0)
  20.      (repeat (sslength ssCircle)
  21.        (entmod(setq Circle (entget(ssname ssCircle index))index(1+ index)
  22.       radius(cdr(assoc 40 Circle))
  23.       Center(vlax-curve-getClosestPointTo LineObj (cdr(assoc 10 Circle)) t)
  24.       center(if(<(distance Point_01 Center)radius)Point_01
  25.        (if(<(distance Point_02 Center)radius)Point_02 Center))
  26.       circle(subst(cons 10 Center)(assoc 10 Circle)Circle)))))))
  27.     (vl-cmdf ".zoom" "p")
  28.     (alert "完成!")
  29.     ))
  30.   (princ)
  31.   )




本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-12-19 22:29:29 | 显示全部楼层
  1. (defun c:tt ()
  2.   (defun dxf (code s1) (cdr (assoc code (entget s1))))
  3.   (defun 3d2d (pt) (mapcar '+ '(0 0) pt))
  4.   (princ "\n请选取要处理的直线对象: ")
  5.   (setq i -1)
  6.   (if (setq ss (ssget '((0 . "line"))))
  7.     (while (setq s1 (ssname ss (setq i (1+ i))))
  8.       (setq p1        (dxf 10 s1)
  9.             p2        (dxf 11 s1)
  10.             rad        (angle p1 p2)
  11.             j        -1
  12.       )
  13.       (if (setq ss1 (ssget "f" (list p1 p2) '((0 . "circle"))))
  14.         (while (setq s2 (ssname ss1 (setq j (1+ j))))
  15.           (setq        p0  (dxf 10 s2)
  16.                 p01 (3d2d p0)
  17.                 p02 (polar p01 (+ rad (* pi 0.5)) 1)
  18.                 pt  (inters (3d2d p1) (3d2d p2) p01 p02 nil)
  19.                 pt  (list (car pt) (cadr pt) (caddr p0))
  20.           )
  21.           (command "move" s2 "" "non" p0 "non" pt)
  22.         )
  23.       )
  24.     )
  25.   )
  26.   (princ)
  27. )
回复

使用道具 举报

发表于 2013-12-19 22:29:38 | 显示全部楼层
本帖最后由 xyp1964 于 2013-12-20 12:34 编辑

  1. (defun c:tt ()
  2.   (defun dxf (code s1) (cdr (assoc code (entget s1))))
  3.   (defun 3d2d (pt) (mapcar '+ '(0 0) pt))
  4.   (defun move (s1 p1 p2)
  5.     (command "move" s1 "" "non" p1 "non" p2)
  6.   )
  7.   (princ "\n请选取要处理的直线对象: ")
  8.   (setq i -1)
  9.   (if (setq ss (ssget '((0 . "line"))))
  10.     (while (setq s1 (ssname ss (setq i (1+ i))))
  11.       (setq p1 (dxf 10 s1)
  12.             p2 (dxf 11 s1)
  13.             p1a (3d2d p1)
  14.             p2a (3d2d p2)
  15.             rad (angle p1 p2)
  16.             j        -1
  17.       )
  18.       (move s1 p1 p1a)
  19.       (if (setq ss1 (ssget "f" (list p1 p2) '((0 . "circle"))))
  20.         (while (setq s2 (ssname ss1 (setq j (1+ j))))
  21.           (setq p0  (dxf 10 s2)
  22.                 p01 (3d2d p0)
  23.                 p02 (polar p01 (+ rad (* pi 0.5)) 1)
  24.                 pt  (inters p1a p2a p01 p02 nil)
  25.                 ;;pt  (list (car pt) (cadr pt) (caddr p0))
  26.                 rr  (dxf 40 s2)
  27.                 p3  (cond ((<= (distance p01 p1a) rr) p1a)
  28.                           ((<= (distance p01 p2a) rr) p2a)
  29.                           (t pt)
  30.                     )
  31.           )
  32.           (move s2 p0 p3)
  33.         )
  34.       )
  35.     )
  36.   )
  37.   (princ)
  38. )
回复

使用道具 举报

 楼主| 发表于 2013-12-20 11:05:16 | 显示全部楼层
xyp1964 发表于 2013-12-19 22:29

有两个问题:
1.直线Z坐标仍然没归零。
2.圆内有端点必须把圆心挪在端点上,园内没端点的才挪在直线上(这个已解决)

点评

试试3楼的代码  发表于 2013-12-21 08:09
...圆内有端点必须把圆心挪在端点上... 程序前之端点才算 or 挪圆后之端点也算 !?  发表于 2013-12-20 22:17
回复

使用道具 举报

发表于 2013-12-20 15:51:02 | 显示全部楼层
  1. ;;;************************Z坐标归0
  2. (defun h-gc1 (/ SS)
  3.   (command "._ucs" "_W")                ;世界坐标系
  4.   (setq ss (ssget))
  5.   ;;Z坐标归零,主要是地形线的影响,所以这一个很重要
  6.   (if ss
  7.     (vl-cmdf ".MOVE"         ss             ""                 "0,0,0"
  8.              "0,0,1000e99"             ".MOVE"         "P"
  9.              ""                 "0,0,1000e99"                 "0,0,0"
  10.             )
  11.   )
  12.   (princ)
  13. )
  14. ;;;************************Z坐标归0;;;************************Z坐标归
回复

使用道具 举报

 楼主| 发表于 2013-12-20 21:48:21 | 显示全部楼层
xyp1964 发表于 2013-12-19 22:29

麻烦高手再改进一下,达到效果如图,第一种才是想要的

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2013-12-22 15:40:14 | 显示全部楼层
xyp1964 发表于 2013-12-19 22:29

果然好用!!谢谢了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-26 01:01 , Processed in 0.177908 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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