明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2352|回复: 11

[求助]对象显示置前和置后的问题?

  [复制链接]
发表于 2006-3-22 16:43:00 | 显示全部楼层 |阅读模式

各位前辈:

      我正在用LISP写了一个给直线打断点的程序,在AutoCAD2004里用,断点的宽度和个数由用户决定,断点的宽度有时可能是0,用户有时会给一条直线打一个宽度是0的断点来把这条线一分为二,经过测试,发现还有不少毛病,其中一个问题是:两条长度一样的直线,一条是水平,一条垂直,两条直线在各自的中点处相交,其实就是一个十字架.我在用我写的程序给这两条线一起各打一个宽度为0的断点时,发现程序只能将其中的一条线一分为二,而另一条却打不断.但要是打有宽度的断点就没有问题.我怀疑可能是这个断点刚好在两条线的交点处,于是把这条没打断的线移动一点再试,结果就可以打断了.但只要把这条线移回原来的地方就怎么也打不断,后来我选中这条没有打断的线,然后在AutoCAD菜单:工具\显示顺序\前置.把这条打不断的线"前置".就可以打断了.请问大家,这个"前置"有没有哪个系统变量可以设置的,这个问题怎么解决?要实在没办法只能在打断每条线之前先把它给前置才行了.但我又不知道怎么调整这个"前置",请前辈们给指点指点,先谢谢了!!!

发表于 2006-3-22 18:47:00 | 显示全部楼层
应该说不存在这种可能,这与前置后置应该没有关系,可能是程序上有不完善的地方。
 楼主| 发表于 2006-3-22 20:36:00 | 显示全部楼层

TO:ljpnb大侠,下面是我直线打断点的程序,能不能在百忙之中抽空帮忙看一看是哪个地方有问题?小弟先谢谢您了!!!!

;;根据用户提供的断点宽度和断点数量来给一些用户选定的对象打断点
;;bb.lsp
;;打断点原则:如果断点宽度为0,按断点数将线段平均分成bnumber+1段.如果断点的宽度大于0, 则将线段平均分成bnumber*2段,然后只在奇数断点处打断,偶数断点忽略.
;;********************************************************************************
(defun c:bb()
  ;;存储环境
  (setq osm (getvar "osmode"))
  (setq oce (getvar "cmdecho"))
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (command ".UNDO" "BE") ;;设定UNDO的开始点
 
  (setq bwidth (getreal "\n请输入断点的宽度:"))
  (setq bnumber (getint "\n请输入断点个数:"))
  ;;断点宽度不能小于0
  (if  (< bwidth 0)
    (setq bwidth 0)
  )
  ;;断点数不能小于1
  (if (< bnumber 1)
    (setq bnumber 1)
  )
  ;;选择要打断点的线
  (setq ss1 (ssget))
  (if (null ss1)
    (progn
      (princ "\n没有选中对象!")
      (setq osm (getvar "osmode"))
      (setq oce (getvar "cmdecho"))
      (setvar "osmode" osm)
      (setvar "cmdecho" oce)
      (command ".UNDO" "E") ;;设定UNDO的结束点
      (exit)
    )
  )
  (setq sl1 (sslength ss1))
 
  (setq ids 0)  ;;选集循环种子初始化
  ;;选集循环开始,对用户所选的对象进行逐一处理
  (while (< ids sl1)
    (setq obname (ssname ss1 ids))
    (setq obinfor (entget obname))
    (setq obtype (cdr (assoc 0 obinfor)))
     ;;判断用户选择的对象类型,多条件开始
    (setq idx 1) ;;循环种子初始值,各种实体类型共用
    (cond
      ((= obtype "LINE")        ;;线条
        (progn
          ;;取得线段的始点和终点
          (setq ptst (cdr (assoc 10 obinfor)))     ;;始点
          (setq pted (cdr (assoc 11 obinfor)))     ;;终点
          (setq ang (angle ptst pted))             ;;角度
          (setq dst (distance ptst pted))          ;;线段长度
          ;;根据断点数来求每段平均长度
          (if (= bwidth 0)
            ;;断点宽度为0时
            (progn
       (setq edst (/ dst (1+ bnumber) 1.0))  ;;断点宽度为0时,分段数为:bnumber+1
              ;;开始循环
              (while (< idx (1+ bnumber ))
         (setq ptxa (polar ptst ang (* edst idx)))
         (setq ptxb ptxa)
         (command "_break" ptxa ptxb)
                (setq idx (1+ idx))
              )
       )
     ;;断点宽度大于0时
     (progn
       (setq edst (/ dst bnumber 2.0))       ;;断点宽度大于0时,分段数为:bnumber*2
              ;;开始循环
              (while (< idx (* bnumber 2))
         (setq ptxa (polar ptst ang (- (* edst idx) (/ bwidth 2.0))))
         (setq ptxb (polar ptst ang (+ (* edst idx) (/ bwidth 2.0))))
          (if (/= (rem idx 2) 0)   ;;只对奇数打断点,偶数忽略
           (command "_break" ptxa ptxb)
         )
                (setq idx (1+ idx))
              )
     )
          )
        )
      )  ;;线条件结束
      ((= obtype "CIRCLE"))      ;;圆
      ((= obtype "ARC"))          ;;弧
      ((= obtype "ELLIPSE"))     ;;椭圆
      ((= obtype "LWPLINE"))     ;;多义线
    ) ;;多条件结束
    (setq ids (1+ ids))         ;;选集循环种子递增。
  )  ;;选集循环结束
 
  (command ".UNDO" "E")  ;;设定UNDO的结束点
  ;;恢复环境
  (setvar "osmode" osm)
  (setvar "cmdecho" oce)
  (princ)
)

发表于 2006-3-22 21:30:00 | 显示全部楼层
你的程序我好象没发现什么问题啊
  1. ;;根据用户提供的断点宽度和断点数量来给一些用户选定的对象打断点
  2. ;;bb.lsp
  3. ;;打断点原则:如果断点宽度为0,按断点数将线段平均分成bnumber+1段.如果断点的宽度大于0, 则将线段平均分成bnumber*2段,然后只在奇数断点处打断,偶数断点忽略.
  4. ;;********************************************************************************
  5. (defun c:bb ()
  6.   ;;存储环境
  7.   (setq osm (getvar "osmode"))
  8.   (setq oce (getvar "cmdecho"))
  9.   (setvar "osmode" 0)
  10.   (setvar "cmdecho" 0)
  11.   (command ".UNDO" "BE")
  12.   ;;设定UNDO的开始点
  13.   (setq bwidth (getreal "\n请输入断点的宽度:"))
  14.   (setq bnumber (getint "\n请输入断点个数:"))
  15.   ;;断点宽度不能小于0
  16.   (if (or (< bwidth 0)(= bwidth nil))
  17.     (setq bwidth 0)
  18.   )
  19.   ;;断点数不能小于1
  20.   (if (or (< bnumber 1)(= bnumber nil))
  21.     (setq bnumber 1)
  22.   )
  23.   ;;选择要打断点的线
  24.   (setq ss1 (ssget))
  25.   (if (null ss1)
  26.     (progn
  27.       (princ "\n没有选中对象!")
  28.       (setq osm (getvar "osmode"))
  29.       (setq oce (getvar "cmdecho"))
  30.       (setvar "osmode" osm)
  31.       (setvar "cmdecho" oce)
  32.       (command ".UNDO" "E")
  33.       ;;设定UNDO的结束点
  34.       (exit)
  35.     )
  36.   )
  37.   (setq sl1 (sslength ss1))
  38.   (setq ids 0)
  39.   ;;选集循环种子初始化
  40.   ;;选集循环开始,对用户所选的对象进行逐一处理
  41.   (while (< ids sl1)
  42.     (setq obname (ssname ss1 ids))
  43.     (setq obinfor (entget obname))
  44.     (setq obtype (cdr (assoc 0 obinfor)))
  45.     ;;判断用户选择的对象类型,多条件开始
  46.     (setq idx 1)
  47.     ;;循环种子初始值,各种实体类型共用
  48.     (cond
  49.       ((= obtype "LINE")
  50.        ;;线条
  51.        (progn
  52.   ;;取得线段的始点和终点
  53.   (setq ptst (cdr (assoc 10 obinfor)))
  54.   ;;始点
  55.   (setq pted (cdr (assoc 11 obinfor)))
  56.   ;;终点
  57.   (setq ang (angle ptst pted))
  58.   ;;角度
  59.   (setq dst (distance ptst pted))
  60.   ;;线段长度
  61.   ;;根据断点数来求每段平均长度
  62.   (if (= bwidth 0)
  63.     ;;断点宽度为0时
  64.     (progn
  65.       (setq edst (/ dst (1+ bnumber) 1.0))
  66.       ;;断点宽度为0时,分段数为:bnumber+1
  67.       ;;开始循环
  68.       (while (< idx (1+ bnumber))
  69.         (setq ptxa (polar ptst ang (* edst idx)))
  70.         (setq ptxb ptxa)
  71.         (command "_break" obname ptxa ptxb)
  72.         (setq obname (entlast))
  73.         (setq idx (1+ idx))
  74.       )
  75.     )
  76.     ;;断点宽度大于0时
  77.     (progn
  78.       (setq edst (/ dst bnumber 2.0))
  79.       ;;断点宽度大于0时,分段数为:bnumber*2
  80.       ;;开始循环
  81.       (while (< idx (* bnumber 2))
  82.         (setq
  83.    ptxa (polar ptst ang (- (* edst idx) (/ bwidth 2.0)))
  84.         )
  85.         (setq
  86.    ptxb (polar ptst ang (+ (* edst idx) (/ bwidth 2.0)))
  87.         )
  88.         (if (/= (rem idx 2) 0)
  89.    ;;只对奇数打断点,偶数忽略
  90.    (command "_break" ptxa ptxb)
  91.         )
  92.         (setq idx (1+ idx))
  93.       )
  94.     )
  95.   )
  96.        )
  97.       )
  98.       ;;线条件结束
  99.       ((= obtype "CIRCLE"))
  100.       ;;圆
  101.       ((= obtype "ARC"))
  102.       ;;弧
  103.       ((= obtype "ELLIPSE"))
  104.       ;;椭圆
  105.       ((= obtype "LWPLINE"))
  106.       ;;多义线
  107.     )
  108.     ;;多条件结束
  109.     (setq ids (1+ ids))
  110.     ;;选集循环种子递增。
  111.   )
  112.   ;;选集循环结束
  113.   (command ".UNDO" "E")
  114.   ;;设定UNDO的结束点
  115.   ;;恢复环境
  116.   (setvar "osmode" osm)
  117.   (setvar "cmdecho" oce)
  118.   (princ)
  119. )
发表于 2006-3-22 22:42:00 | 显示全部楼层

这个给您参考

Command: (setq ee (list ee pt))
(<Entity name: 7ef5fee8> (289.215 142.986 0.0))

Command: b
BREAK Select object: !ee
(<Entity name: 7ef5fee8> (289.215 142.986 0.0))

Specify second break point or [First point]: f

Specify first break point: !pt
(289.215 142.986 0.0)

Specify second break point: !pt
(289.215 142.986 0.0)

 楼主| 发表于 2006-3-23 09:12:00 | 显示全部楼层

To:ljpnb大侠,谢谢您的帮忙,我看了您给我修改的程序

 (command "_break" obname ptxa ptxb)    ;;我在这里加上了obname
 (setq obname (entlast))    ;;在下面加了这行语句,直线的问题就解决了。但给圆圈打断点的程序里加上后面这句就出问题了。出现要打三个断点的就只能打一个。我正在研究中。另外我想问一问,怎样才能像您这样把代码插入到那个列表框里,而且还能改字体颜色?

To:Andyhon大侠,谢谢您,我想在程序里解决问题。

发表于 2006-3-23 09:24:00 | 显示全部楼层

如果是给圆打断,需要注意两点:

一,断口宽度为0时,不可以直接(command "_break" obname ptxa ptxa

二。断口宽度为>0时,第一次break后,没有产生新的实体,也就是说用(setq obname (entlast)) 这句是错误的。第二次break后,才可以用(setq obname (entlast)

 楼主| 发表于 2006-3-23 15:10:00 | 显示全部楼层
TO:ljpnb大侠,那么断点宽度为0时,我该怎么处理呢?能不能讲一讲?谢谢您!
发表于 2006-3-23 15:31:00 | 显示全部楼层
参考一下:
  1. (defun c:dfy (/ ent old-num num p0 p1 param div-param i point);_等分圆
  2.    (setq ent (car (entsel "\n选择需要等分的圆:")))
  3.    (if (null old-num)
  4.      (setq old-num 2)
  5.    )
  6.    (if (setq num (getint (strcat "\n输入等分数量<" (rtos old-num) ">:")))
  7.      (setq old-num num)
  8.      (setq num old-num)
  9.    )
  10.    (setq obj (vlax-ename->vla-object ent))
  11.    (setq p0   (vlax-curve-getStartPoint obj)
  12.   param   (vlax-curve-getEndParam obj)
  13.   div-param (/ param num)
  14.    )
  15.    (setq p1 (vlax-curve-getPointAtParam obj -0.1))
  16.    (command "break" ent "none" p1 "none" p0)
  17.    (setq i 1)
  18.    (repeat (1- num)
  19.      (setq point (vlax-curve-getPointAtParam obj (* i div-param)))
  20.      (command "break" ent "none" point "none" point)
  21.      (setq ent (entlast))
  22.      (setq obj (vlax-ename->vla-object ent))
  23.      (setq i (1+ i))
  24.    )
  25.    (vla-put-endangle obj 0.0)
  26.    (princ)
  27. )
 楼主| 发表于 2006-3-23 16:22:00 | 显示全部楼层
哇,好多新函数呀,好好学习!!!谢谢ljpnb前辈.另外小弟有一事相求,能否加您为我的QQ好友?我的QQ号为:86851026,如果能有您这么一位知识丰富的QQ好友实在是我三生的荣幸呀!!!当然如果不方便也没关系,咱们也可以在论坛里交流.再次感谢您的热心帮助!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-8 04:57 , Processed in 0.179509 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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