明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1268|回复: 4

关于用程序自动修改的问题,请高人帮忙.

[复制链接]
发表于 2007-4-11 09:03 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-4-11 9:04:29 编辑

请高人帮一下,我经常会处理大量的这样的文件,就是有很多处没有交上,需要用手工fillet 0来把相临的二条线交上,如外面四个箭头所指处.另外还有,就是如中间箭头所指处是两条线断,需要改成一条直线.

请高人看看用LISP自动修改有没有可能?应如何编这些程序?思路是什么?

本帖子中包含更多资源

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

x
 楼主| 发表于 2007-4-11 17:15 | 显示全部楼层

怎么没人回复,这难度很大吗?哪位高人给我支下招行吗?

发表于 2007-4-11 19:05 | 显示全部楼层
本帖最后由 作者 于 2007-4-11 19:08:50 编辑

楼主也太心急了,高手可不是经常在线的。
  1. 一、对于图形中间的直线连接,可以通过调用系统命令JOIN来完成。
  2. 二、对于接头处的断开问题,可以使用延伸和剪切,并诸次探测的方法解决。
  3. 其步骤是:
  4. 1.先设置一个较小的尺寸阀值,这个阀值应比所要操作对象的个体都大;
  5. 2.提示选择要操作的一堆对象;
  6. 3.设第一个对象为当前对象;
  7. 4.以其它对象为边界,延伸和剪切当前对象;
  8. 3.然后判断:a.若当前对象无变化,则下一个对象;
  9.             b.若当前对象的变化值大于阀值,则回撤操作,并下一个对象;
  10.             c.若当前对象的变化值不大于阀值,则继续对当前对象进行操作(即转到 4 )
  11. 4.直至选择的对象全部完成。
复制代码
 楼主| 发表于 2007-4-12 08:02 | 显示全部楼层

JOIN是哪个版本的命令,我这是2004的,怎么没有这个命令.

在这先谢谢3楼的朋友,不过你说的我不是太懂.阀值是固定不变的吗?怎么判断对像的变化值是否大于阀值?

发表于 2007-4-12 19:05 | 显示全部楼层
一、JOIN是2006版的命令。
二、阀值是允许被操作对象改变的尺寸大小。
阀值的大小可以固定不变,也可以根据不同使用对象进行设置。
三、
怎么判断对像的变化值是否大于阀值?
这个问题应该是“怎么判断对像的变化值的大小?”,答案是比较操作前后当前对象的起终点坐标。
四、关于获得比较操作前后当前对象的典型例子代码如下:
http://p4.xdcad.net/forum/showthread.php?s=&postid=3106068#post3106068 第6楼代码如下:
  1.   
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;;ZML84制作于2006-12-07
  4. ;;;==========================================
  5. ;;;全局变量说明:
  6. ;;;EDGE_JL  外延距离
  7. ;;;==========================================
  8. (defun c:tt (/ S0 S1 PT entl LX
  9.        PT0 PT0_OLD PT1 PT1_OLD)
  10.     (princ "\n★★超级修剪★★")
  11.     (setq CMDECHO_OLD (getvar "CMDECHO")
  12.     )
  13.     (Setvar "CMDECHO" 0)
  14.     (if  (or (= EDGE_jl "") (= EDGE_jl nil))
  15.   (setq EDGE_jl 5.0)
  16.     )
  17.     (princ
  18.   (strcat  "\n当前设置:投影="
  19.     (nth (getvar "PROJMODE") '("不投影" "当前UCS" "当前视图"))
  20.     ",边="
  21.     (nth (getvar "EDGEMODE") '("不延伸" "延伸"))
  22.     ",外延距离="
  23.     (rtos EDGE_JL 2 (getvar "LUPREC"))
  24.   )
  25.     )
  26.     (princ "\n选择剪切边...")
  27.     (setq S0 (ssget))
  28.     (if  (= S0 nil)
  29.   (princ "\n★未选择边界,即将退出。")
  30.   (progn
  31.       (setq S1 nil)
  32.       (while (or (/= S1 nil)
  33.            (/= nil
  34.          (progn (initget 4 "P E D U")
  35.           (setq  pt (GETPOINT
  36.                  "\n选择要修剪的对象,或 [投影(P)/边(E)/外延距离(D)/放弃(U)]:"
  37.              )
  38.           )
  39.          )
  40.            )
  41.        )
  42.     (cond
  43.         ((= pt "P") ;分支一:投影选项设置
  44.          (progn
  45.        (initget 4)
  46.        (SETQ
  47.            XX  (getint
  48.             (strcat
  49.           "\n输入投影选项 [无(0)/UCS(1)/视图(2)] <"
  50.           (itoa (getvar "PROJMODE"))
  51.           ">:"
  52.             )
  53.         )
  54.        )
  55.        (if (or (= xx 0) (= xx 1) (= xx 2))
  56.            (Setvar "PROJMODE" xx)
  57.        )
  58.          )
  59.         )
  60.         ((= pt "E") ;分支二:边延伸选项设置
  61.          (progn
  62.        (initget 4)
  63.        (SETQ XX (getint
  64.               (strcat
  65.             "\n输入隐含边延伸模式 [不延伸(0)/延伸(1)] <"
  66.             (itoa (getvar "EDGEMODE"))
  67.             ">:"
  68.               )
  69.           )
  70.        )
  71.        (if (or (= xx 0) (= xx 1))
  72.            (Setvar "EDGEMODE" xx)
  73.        )
  74.          )
  75.         )
  76.         ((= pt "D") ;分支三:外延距离选项设置
  77.          (progn
  78.        (initget 4)
  79.        (SETQ XX (getdist
  80.               (strcat
  81.             "\n输入外延的距离 <"
  82.             (rtos  EDGE_jl
  83.             2
  84.             (getvar "LUPREC")
  85.             )
  86.             ">:"
  87.               )
  88.           )
  89.        )
  90.        (if (>= xx 0)
  91.            (setq EDGE_jl xx)
  92.        )
  93.          )
  94.         )
  95.         ((= pt "U") ;分支四:撤销上一步操作
  96.          (command "_.undo" 1)
  97.         )
  98.         ((listp pt) ;分支五:对选中的对象进行修剪操作
  99.          (if (ssget pt)
  100.        (progn
  101.            (setq s1 (list (ssname (ssget pt) 0) pt))
  102.            (setq entl  (entget (car s1) '("*"))
  103.            LX  (dxf_let entl 0)
  104.            )
  105.            (cond ;对各种对象类型进行操作。
  106.          ((= LX "LINE")
  107.           (progn
  108.               (command "_.undo" "be")
  109.               (setq pt0_old (dxf_let entl 10)
  110.               pt1_old (dxf_let entl 11)
  111.               )
  112.               (command "_trim" s0 "" s1 "")
  113.               (setq entl (entget (car s1) '("*")))
  114.               (setq pt0  (dxf_let entl 10)
  115.               pt1  (dxf_let entl 11)
  116.               )
  117.               (if (and (equal pt0 pt0_old)
  118.                  (equal pt1 pt1_old)
  119.             )
  120.             (princ "\n★对象未与边相交。")
  121.             (progn
  122.                 (if (not (equal pt0 pt0_old))
  123.      ;检查起点
  124.               (dxf_set
  125.                   entl
  126.                   10
  127.                   (polar pt0
  128.                    (angle pt0 pt0_old)
  129.                    EDGE_jl
  130.                   )
  131.               )
  132.               (if (not (equal pt1 pt1_old))
  133.      ;检查终点
  134.                   (dxf_set
  135.                 entl
  136.                 11
  137.                 (polar pt1
  138.                  (angle  pt1
  139.                   pt1_old
  140.                  )
  141.                  EDGE_jl
  142.                 )
  143.                   )
  144.               )
  145.                 )
  146.                 (command "_.undo" "e")
  147.             )
  148.               )
  149.           )
  150.          )
  151.          ((= LX "ARC")
  152.           (princ (strcat "\n★对象类型为""
  153.              LX
  154.              "",暂不能处理。"
  155.            )
  156.           )
  157.          )
  158.          (T
  159.           (princ
  160.               (strcat "\n★对象类型""
  161.                 LX
  162.                 "",拒绝操作。"
  163.               )
  164.           )
  165.          )
  166.            )
  167.        )
  168.        (princ "\n★未选择到对象。")
  169.          )
  170.         ) ;结束 分支五
  171.     ) ;结束 cond 结束分支
  172.     (setq S1 nil)
  173.       ) ;结束 while
  174.   )
  175.     ) ;结束 if
  176.     (Setvar "CMDECHO" CMDECHO_OLD)
  177.     (princ "\n★正常结束。谢谢使用。")
  178.     (princ)
  179. );结束 defun
  180. ;;;定义函数,用于提取属性。
  181. (defun dxf_let (ent n)
  182.     (if  (assoc n ent)
  183.   (cdr (assoc n ent))
  184.   nil
  185.     )
  186. );结束 defun
  187. ;;;定义函数,用于修改属性。
  188. (defun dxf_set (ent n nr)
  189.     (if  (assoc n ent)
  190.   (progn
  191.       (setq ent (subst (cons n nr) (assoc n ent) ent)
  192.       )
  193.       (entmod ent)
  194.   )
  195.   nil
  196.     ) ;结束 if
  197. );结束 defun
  198. (princ "\n\n★超级修剪。键入命令"TT"执行。")
  199. (princ)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 14:39 , Processed in 0.163687 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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