明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2478|回复: 8

[求助]关于线的打断break问题,大家帮帮忙

[复制链接]
发表于 2006-1-9 16:32 | 显示全部楼层 |阅读模式

我有一个想法,选取一条直线后,通过输入平分的段数,通过divide操作后,获取平分点的坐标
,然后根据输入的距离,再线上的平分点左右得到另外两个点,这样再通过break断开这两点间距离。。。不知道说清楚没有,呵呵,下面我编了点,可是到break的时候就出错了。大家帮我看看吧。。谢谢~~~~
(defun c:bre ()
(setq ent (entsel "select the Line you need:"))
(setq ent0 (car ent))
(setq data (entget ent0))
(setq etype (cdr (assoc 0 data)))
(if (/= etype "LINE")
(progn
(prompt "The entity is not 'LINE' ")
(exit)
)
)
(setq spnt (assoc 10 data))
(setq epnt (assoc 11 data))
(setq langle (getangle "Input lines' Angel:"))
(setq vpnt (getint "Input the number of bridge:"))
(setq dis (getint "Input the distance of bridge:"))
(setq vn (+ 1 vpnt))
(command "_.divide" ent vn)
(setvar "osmode" 0)
(setq psele (ssget "p"))
(setq i 0)
(while (< i vpnt)
(setq e (ssname psele i))
(setq spdat (cdr (assoc 10 (entget e))))
(setq epdat1 (polar spdat langle (/ dis 2)))
(setq epdat2 (polar spdat (+ pi langle) (/ dis 2)))
(command "_.break" (list ent epdat1) "f" epdat1 epdat2)
(setq ent (entlast))
(setq i (+ i 1))
)
)

本帖子中包含更多资源

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

x
发表于 2006-1-9 17:16 | 显示全部楼层

(while (< i vpnt)语句之前加一句
(SETQ ENT (CAR ENT))

 楼主| 发表于 2006-1-10 09:11 | 显示全部楼层
我试过啦,不行的
发表于 2006-1-10 09:49 | 显示全部楼层
本帖最后由 作者 于 2006-1-10 10:44:00 编辑

(defun c:bre ()
  (setq ent (entsel "\n select the Line you need:"))
  (setq ent0 (car ent))
  (setq data (entget ent0))
  (setq etype (cdr (assoc 0 data)))
  (if (/= etype "LINE")
    (progn
      (prompt "The entity is not 'LINE' ")
      (exit)
    )
  )
  (setq spnt (CDR (assoc 10 data)))
  (setq epnt (cdr (assoc 11 data)))
;;;(setq langle (getangle "Input lines' Angel:"))
  (setq langle (angle spnt epnt));_换成这样格式
  (setq vpnt (getint "\n Input the number of bridge:"))
  (setq dis (getint "\n Input the distance of bridge:"))
  ;;(setq vn (+ 1 vpnt))
  (command "_.divide" ent (1+ vn))
  (setvar "osmode" 0)
  (setq psele (ssget "p"))
  (setq i 0)
  (while (< i (sslength psele))
    (setq e (ssname psele i))
    (setq spdat (cdr (assoc 10 (entget e))))
    (setq epdat1 (polar spdat langle (/ dis 2.0)))
    (setq epdat2 (polar spdat (+ pi langle) (/ dis 2.0)))
    (command "break" (list ent0 epdat1) "f" epdat1 epdat2);;ent改成ent0
    (setq ent0 (entlast));_
    (setq i (1+ i))
  )
)

发表于 2006-1-10 12:21 | 显示全部楼层
  1. ;;我写的打缺口程式为什么有时会出错?
  2. ;;该程式是用来将线、圆、弧打上缺口,缺口大小与个数由用户输入,
  3. ;;但是在使用过程中,当用户输入的个数太多时,经常会发生所生成的缺口
  4. ;;不是用户输入的大小,并且位置也不正确,请大家帮我分析一下此程式,谢谢!
  5. ;;这个程式是用在镭射切割图形方面的,这个缺口,
  6. ;;专有名词叫"桥位元",就是镭射按照图形切割时,
  7. ;;桥位元的地方就不要切,目的是防止图形中闭合部分掉下去,
  8. ;;举例:我画一个100x100的方框,先炸开它,输入命令bk,默认的半断宽度为6mm,
  9. ;;若是直线,默认的半断的个数是1个,若为圆,默认的半断是3,我先选直线,
  10. ;;输入2个、3个、4个、等,都能正确的打上缺口,但是若输入的缺口个数过多,
  11. ;;则会出现所打的缺口不在我所想要的位置,此时再选其他的线、圆等,
  12. ;;都会出现所打的缺口不是6mmm,并且不在要求的位置,但是开新档后,
  13. ;;一切又恢复正确,另外我还写了一个程式是用来恢复这个缺口的,
  14. ;;我现在检查了bk.lsp的所有参数,但就是找不出为什么会出错
  15. (defun C:BK (/     HOLDECHO   HOLDOSMODE HOLDCL QBLL   AA
  16.       QI     QCCC   CBB   AAB  BB ST     QED    AD
  17.       DD     AJ    XAA   AED  ANG SPT    ANS    ANE
  18.       ANG    PT    PT1   ACCC  ARC_1 ARC_L
  19.      )
  20.   (setq HOLDECHO (getvar "cmdecho"))
  21.   (setvar "cmdecho" 0)
  22.   (command "_.undo" "group")
  23.   (setq HOLDOSMODE (getvar "osmode"))
  24.   (setq HOLDCL (getvar "clayer"))
  25.   (setvar "osmode" 0)
  26.   (setq QBL (getdist (strcat "\n 请输入缺口尺寸:<6>: ")))
  27.   (if (= QBL NIL)
  28.     (setq QBL 6.0)
  29.   )
  30.   (setq AA (ssget '((0 . "line,circle,arc"))))
  31.   (setq QI 0
  32. QCCC 1
  33. QCC NIL
  34. CBB 1
  35. CB NIL
  36. ACCC 1
  37. ACC NIL
  38.   )
  39.   (if (/= NIL AA)
  40.     (repeat (sslength AA)
  41.       (setq AAB (ssname AA QI))
  42.       (redraw AAB 3)
  43.       (setq BB (cdr (assoc 0 (entget AAB))))
  44.       (setvar "clayer" (cdr (assoc 8 (entget AAB))))
  45.       (cond
  46. ((= BB "LINE")
  47.   (setq ST (cdr (assoc 11 (entget AAB))))
  48.   (setq QED (cdr (assoc 10 (entget AAB))))
  49.   (setq AD (distance ST QED)
  50.         DD (angle ST QED)
  51.   )
  52.   (if (< QBL AD)
  53.     (progn
  54.       (while (or (= QCC NIL) (> (* QCC QBL) AD))
  55.         (setq QCC
  56.         (getint
  57.    (strcat "\n 输入直线缺口个数 :<" (rtos QCCC) ">: ")
  58.         )
  59.         )
  60.         (if (= QCC NIL)
  61.    (setq QCC QCCC)
  62.    (setq QCCC QCC)
  63.         )
  64.       )
  65.       (setq AJ (/ (- AD (* QBL QCC)) (+ QCC 1)))
  66.       (setq XAA (polar ST DD (+ AJ QBL)))
  67.       (entdel AAB)
  68.       (command "_.line" ST (polar ST DD AJ) "")
  69.       (repeat QCC (command "_.copy" (entlast) "" ST XAA))
  70.     )
  71.   )
  72. )
  73. ((= BB "CIRCLE")
  74.   (setq ST (cdr (assoc 10 (entget AAB))))
  75.   (setq AED (cdr (assoc 40 (entget AAB))))
  76.   (if (< QBL (* pi 2 AED))
  77.     (progn
  78.       (while (or (= CB NIL) (> (* CB QBL) (* pi 2 AED)))
  79.         (setq
  80.    CB
  81.     (getint
  82.       (strcat "\n 输入圆上缺口个数 :<" (rtos CBB) ">: ")
  83.     )
  84.         )
  85.         (if (= CB NIL)
  86.    (setq CB CBB)
  87.    (setq CBB CB)
  88.         )
  89.       )
  90.       (setq AJ (/ (- (* pi 2 AED) (* QBL CB)) CB))
  91.       (setq ANG (/ AJ AED 2.0))
  92.       (if
  93.         (>= (distance (polar ST (- ANG) AED) (polar ST ANG AED))
  94.      0.0001
  95.         )
  96.   (progn
  97.     (entdel AAB)
  98.     (command "_.arc"
  99.       (polar ST (- ANG) AED)
  100.       (polar ST 0 AED)
  101.       (polar ST ANG AED)
  102.     )
  103.     (if (> CB 1)
  104.       (command "_.array" (entlast) "" "p" ST CB "" "")
  105.     )
  106.   )
  107.       )
  108.     )
  109.   )
  110. )
  111. ((= BB "ARC")
  112.   (setq ST (cdr (assoc 10 (entget AAB))))
  113.   (setq AED (cdr (assoc 40 (entget AAB))))
  114.   (setq SPT (polar ST (cdr (assoc 50 (entget AAB))) AED))
  115.   (setq ANS (cdr (assoc 50 (entget AAB))))
  116.   (setq ANE (cdr (assoc 51 (entget AAB))))
  117.   (if (> ANE ANS)
  118.     (setq ANG (- ANE ANS))
  119.     (setq ANG (+ ANE (- (* 2 pi) ANS)))
  120.   )
  121.   (setq ARC_L (* AED ANG))
  122.   (if (< QBL ARC_L)
  123.     (progn
  124.       (while (or (= ACC NIL) (> (* ACC QBL) ARC_L))
  125.         (setq ACC
  126.         (getint
  127.    (strcat "\n 输入弧线缺口个数 :<" (rtos ACCC) ">: ")
  128.         )
  129.         )
  130.         (if (= ACC NIL)
  131.    (setq ACC ACCC)
  132.    (setq ACCC ACC)
  133.         )
  134.       )
  135.       (setq ARC_1 (/ (- ARC_L (* QBL ACC)) (1+ ACC) AED))
  136.       (entdel AAB)
  137.       (command "_.arc" "c" ST SPT "A" (/ (* ARC_1 180) pi))
  138.       (command "_.ARRAY"
  139.         (entlast)
  140.         ""
  141.         "P"
  142.         ST
  143.         (1+ ACC)
  144.         (/ (* (- (/ ARC_L AED) ARC_1) 180) pi)
  145.         ""
  146.       )
  147.     )
  148.   )
  149. )
  150.       )
  151.       (setq QI (1+ QI))
  152.     )
  153.   )
  154.   (setvar "clayer" HOLDCL)
  155.   (setvar "osmode" HOLDOSMODE)
  156.   (command "_.undo" "end")
  157.   (setvar "cmdecho" HOLDECHO)
  158.   (princ)
  159. )
发表于 2006-1-10 16:31 | 显示全部楼层
maomao2004发表于2006-1-10 9:11:00我试过啦,不行的


我又试了一遍,没有问题。其实我的改法跟4楼ljpnb的原理是一样的。

你的程序第一次执行“(command "_.break" (list ent epdat1) "f" epdat1 epdat2)”语句时,ent 的内容是(<图元名: ####>(选取点坐标))而本应该只是(<图元名: ####>)。

我想你试不出来是否输入数目太多或角度问题

 楼主| 发表于 2006-1-10 17:27 | 显示全部楼层

hehe,好了,谢谢了,还有这个程序是调试版本,还没有优化呢,比较粗糙

见笑阿!

发表于 2006-1-10 23:19 | 显示全部楼层
  1. (load "xyp_lib.vlx") ;版本 V.20051230 (1873)
  2. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  3. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  4. ★1·在acad.lsp中增加(load"xyp_lib")
  5. ■2·在每个程序内增加(load"xyp_lib")
  6. ■3·在command下,输入(load"xyp_lib")
  7. ■4·在菜单.mnl中增加(load"xyp_lib")
  8. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  9. [COLOR=red] ★通用函数下载地址:[/COLOR]
  10. [url]http://www.xdcad.net/forum/attachment.php?s=&postid=1606661[/url]
  11. [url]http://bbs.mjtd.com/forum.php?mod=viewthread&tid=37554[/url]
  12. |;
  13. ;;;线开口
  14. (defun c:test040 (/ pt1 pt2 ss i e leng df ss1)
  15.   (CMDLA0)
  16.   (setvar "osmode" 0)
  17.   (setq NO1 (UREAL 7 "" "\n线长" no1)
  18. NO2 (UREAL 7 "" "\n缺口长" no2)
  19. ss  (ssget '((0 . "CIRCLE,ELLIPSE,*LINE,ARC")))
  20. i   -1
  21.   )
  22.   (while (setq e (ssname ss (setq i (1+ i))))
  23.     (setq leng (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))
  24.    df   (fix (abs (/ leng (+ NO1 no2))))
  25.     )
  26.     (repeat df
  27.       (setq pt1 (vlax-curve-getPointAtDist
  28.     (vlax-ename->vla-object e)
  29.     no1
  30.   )
  31.      pt2 (vlax-curve-getPointAtDist
  32.     (vlax-ename->vla-object e)
  33.     (+ no1 no2)
  34.   )
  35.       )
  36.       (command "break" e pt1 pt2)
  37.       (setq e (entlast))
  38.     )
  39.   )
  40.   (CMDLA1)
  41. )
发表于 2008-5-26 21:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-12 05:34 , Processed in 0.157118 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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