找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: xiaotang

[求助] [求助]:对象捕捉自动清除了,寻求解决?

[复制链接]
发表于 2005-8-23 21:55:45 | 显示全部楼层
哈哈,要知道,看别人的程序是最头痛的事。
就说你在8楼的程序吧,既没有出错处理,又没有把变量限制成局部变量(容易造成内存中的变量冲突),还有,每次都要重新设置字体样式(应该加个判断,即“如果没有某字体样式则设置,否则就使用”),这么多问题,不算什么好程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-23 22:01:06 | 显示全部楼层
正因为不是好程序才请你修改啊。
变量是我自己加的,本来只有2个,代码是“33”,我嫌少了就添了几个上去。看来不是越多越好:)
字体样式也是我找人帮我加的。

唉,外行就是外行啊,我全部改错了:(
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-23 22:37:42 | 显示全部楼层
提供一下思路
1,你这个程序好像是把坐标点值写出来,那我要问你了,所谓坐标值就是相对于坐标原点的,如果你想人为定某个点为基准点,标出相对于这个基准点的“坐标”值就不行了。
所以,程序一开始要有一个“选取基准点 <0,0>:”选项。当然,这样做后,x=x-x0,y=y-y0了。
2,把所有变量设成局部变量,程序一结束,变量清零。
方法很简单,就是第一句改成
(defun c:zb (/ os x y ...)
3,要用户做的事先提,程序做的事后做,就是先取得pt,pt1,然后由pt,pt1求得x,y,x1,y1.这样做的目的是让用户感觉速度很快(大型程序就要考虑用户的感受)
4,字体样式名不要用系统缺省的Standard,并且用下面这个语句判断是否已经存在
  (if  (null (setq elist (tblsearch "style" "Times")))
    (command "_style"  "Times"    "Times.ttf"    "0.0"   ""   "0.0"   ""  ""  )
  )
  (setvar "TEXTSTYLE" "Times")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-23 22:55:45 | 显示全部楼层
思路?我是个绝对外行,思路没用啊*-*2

这个程序我是用来标注地形图上的绝对坐标的,所以没有指定基点。
按照你的意思,我改了一下,还要麻烦你帮忙看看。
(首先声明,我是外行,不要笑我。)[/COLOR]

[PHP];;;    此小程序为将坐标写在CAD中
(defun c:zb (/ os x y ...))
  (setvar "cmdecho" 0)
(setq os (getvar "osmode"))   
(setvar "osmode" 4271)
(setq pt (getpoint "\n拾取需要标注的点:"))
(setq y (car pt))
(setq x (cadr pt))
(setq pt1 (getpoint pt "\n拾取标注线起点:"))
(setq x1 (car pt1))
(setq y1 (cadr pt1))
  (setq y2 y1)
  (if (> x1 y)     
      (setq x2 (+ x1 16)
        xx2 (+ x1 0.5))
      (setq x2 (- x1 16)
        xx2 (+ x2 0.5)))
(setvar "osmode" 0)
(setq pt2 (list x2 y2))
(command "line" pt pt1 pt2 "")
(if (null (setq elist (tblsearch "style" "Times")))
(command "_style" "Times" "Times.ttf" "0.0" "" "0.0" "" "" )
)
(setvar "TEXTSTYLE" "Times")
  (setq dis (getvar "dimzin"))
  (setvar "dimzin" 1)
(command "text" "ml" (list xx2 (+ y1 1.625)) 2 0 (strcat "X " (rtos x 2 3)))
(command "text" "ml" (list xx2 (- y1 1.625)) 2 0 (strcat "Y " (rtos y 2 3)))
(setvar "osmode" os)
  (setvar "dimzin" dis)
  (princ)
)

;;-------------------------------------------
(defun xxx_err (s)
(setvar "osmode" os)
(command "_.UNDO" "_E")
)

;;=============== Main program ============

(defun c:xxx (/ ...)
(setq *error* xxx_err)
(setq os (getvar "osmode")
)
(setvar "osmode" 0)
......
(setvar "osmode" os)
(princ)
) [/PHP]


[B]另外,请版主把这个主题移动到LISP版块吧。[/B]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-23 23:25:58 | 显示全部楼层
改了一下,没测试

  1.   [FONT=courier new]
  2. ;;;    此小程序为将坐标写在CAD中
  3. ;; pt0_zb_cdhuaoo1 标注基准点,全局变量
  4. ;;-------------------------------------------
  5. (defun zb_err (s)
  6.   (if (/= s "Function cancelled")
  7.     (princ (strcat "\nError: " s))
  8.   )
  9.   (setvar "osmode" os)
  10.   (setvar "dimzin" dis)
  11.   (setvar "cmdecho" cmd)
  12.   (command "_.UNDO" "_E")
  13. )

  14. ;;=============== Main program ============

  15. (defun c:zb (/ cmd os pt x y pt1 x1 y1 xx2 pt2 dis)
  16.   (setq *error* zb_err)
  17.   (setq cmd (getvar "cmdecho"))
  18.   (setvar "cmdecho" 0)
  19.   (setq os (getvar "osmode"))
  20.   (setvar "osmode" 4271)
  21.   (if (= pt0_zb_cdhuaoo1 nil)
  22.     (setq pt0_zb_cdhuaoo1 (getpoint "\n拾取标注基准点<0,0>:"))
  23.   )
  24.   (setq        pt  (getpoint "\n拾取需要标注的点:")
  25.         pt1 (getpoint pt "\n拾取标注线起点:")
  26.   )

  27.   (setq        y  (car pt)
  28.         x  (cadr pt)
  29.         x1 (car pt1)
  30.         y1 (cadr pt1)
  31.         y2 y1
  32.   )
  33.   (if pt0_zb_cdhuaoo1
  34.     (setq x (- x (car pt0_zb_cdhuaoo1))
  35.           y (- y (cadr pt0_zb_cdhuaoo1))
  36.     )
  37.   )
  38.   (if (> x1 y)
  39.     (setq x2  (+ x1 16)
  40.           xx2 (+ x1 0.5)
  41.     )
  42.     (setq x2  (- x1 16)
  43.           xx2 (+ x2 0.5)
  44.     )
  45.   )
  46.   (setvar "osmode" 0)
  47.   (setq pt2 (list x2 y2))
  48.   (command "line" pt pt1 pt2 "")
  49.   (if (null (setq elist (tblsearch "style" "Times")))
  50.     (command "_style" "Times" "Times.ttf" "0.0" "" "0.0" "" "")
  51.   )
  52.   (setvar "TEXTSTYLE" "Times")
  53.   (setq dis (getvar "dimzin"))
  54.   (setvar "dimzin" 1)
  55.   (command "text"
  56.            "ml"
  57.            (list xx2 (+ y1 1.625))
  58.            2
  59.            0
  60.            (strcat "X " (rtos x 2 3))
  61.   )
  62.   (command "text"
  63.            "ml"
  64.            (list xx2 (- y1 1.625))
  65.            2
  66.            0
  67.            (strcat "Y " (rtos y 2 3))
  68.   )
  69.   (setvar "osmode" os)
  70.   (setvar "dimzin" dis)
  71.   (setvar "cmdecho" cmd)
  72.   (princ)
  73. )


  74.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-23 23:36:30 | 显示全部楼层
一个“门外汉”能写出这样的程序?看来不算嘛
(command "_.UNDO" "_E") ???
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-23 23:40:47 | 显示全部楼层
柔柔大侠,还有点小问题:
1、我不需要指定坐标原点。
2、方向有点问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-23 23:46:18 | 显示全部楼层
那就去掉下面列出的语句
;; pt0_zb_cdhuaoo1 标注基准点,全局变量

  (if (= pt0_zb_cdhuaoo1 nil)
    (setq pt0_zb_cdhuaoo1 (getpoint "\n拾取标注基准点<0,0>:"))
  )


  (if pt0_zb_cdhuaoo1
    (setq x (- x (car pt0_zb_cdhuaoo1))
          y (- y (cadr pt0_zb_cdhuaoo1))
    )
  )
另外,我没测试程序,原来程序内容没仔细看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-23 23:59:44 | 显示全部楼层
前面的两个问题都OK了。
试验了一下强行终止程序,得到如下提示,不知是否正常:
 Error: 函数被取消; 错误: *error* 函数中出错AutoCAD 变量设置被拒绝: "dimzin" nil
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2005-8-24 08:45:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
这是程序终止发生在变量“dimzin”被保存之前的缘故,将出错函数中“(setvar "dimzin" dis)”改为“(if dis (setvar "dimzin" dis))”即可。
另外,我理解,这个程序是从一个大程序中截取的,或者是由另外的程序修改的,程序中“(command "_.UNDO" "_E") ”一句是undo处理,应该是与“(command "_.UNDO" "_BE") ”对应的,对于使用了较多“command”函数的程序一般这样处理。本程序可以在开始(第一句)加上“(command "_.UNDO" "_BE") ”,在最后(“(princ)”之前)加上“(command "_.UNDO" "_E") ”。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2005-8-24 09:03:57 | 显示全部楼层
最初由 ll_j 发布
[B]这是程序终止发生在变量“dimzin”被保存之前的缘故,将出错函数中“(setvar "dimzin" dis)”改为“(if dis (setvar "dimzin" dis))”即可。
另外,我理解,这个程序是从一个大程序中截取的,或者是由另外的程序修?.. [/B]

这里前后共有两段setvar "dimzin" dis,不知改哪一个?
另外,这段“本程序可以在开始(第一句)加上“(command "_.UNDO" "_BE") ”,在最后(“(princ)”之前)加上“(command "_.UNDO" "_E") ”。”
该怎样操作,请贴图帮助好吗,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2005-8-24 10:08:18 | 显示全部楼层
这样
[php];;;    此小程序为将坐标写在CAD中
;; pt0_zb_cdhuaoo1 标注基准点,全局变量
;;-------------------------------------------
(defun zb_err (s)
  (if (/= s "Function cancelled")
    (princ (strcat "\nError: " s))
  )
  (setvar "osmode" os)
  (if dis (setvar "dimzin" dis))                  ;****
  (setvar "cmdecho" cmd)
  (command "_.UNDO" "_E")
)

;;=============== Main program ============

(defun c:zb (/ cmd os pt x y pt1 x1 y1 xx2 pt2 dis)
  (command "_.UNDO" "_BE")      ;*****
  (setq *error* zb_err)
  (setq cmd (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq os (getvar "osmode"))
  (setvar "osmode" 4271)
  (if (= pt0_zb_cdhuaoo1 nil)
    (setq pt0_zb_cdhuaoo1 (getpoint "\n拾取标注基准点<0,0>:"))
  )
  (setq        pt  (getpoint "\n拾取需要标注的点:")
        pt1 (getpoint pt "\n拾取标注线起点:")
  )

  (setq        y  (car pt)
        x  (cadr pt)
        x1 (car pt1)
        y1 (cadr pt1)
        y2 y1
  )
  (if pt0_zb_cdhuaoo1
    (setq x (- x (car pt0_zb_cdhuaoo1))
          y (- y (cadr pt0_zb_cdhuaoo1))
    )
  )
  (if (> x1 y)
    (setq x2  (+ x1 16)
          xx2 (+ x1 0.5)
    )
    (setq x2  (- x1 16)
          xx2 (+ x2 0.5)
    )
  )
  (setvar "osmode" 0)
  (setq pt2 (list x2 y2))
  (command "line" pt pt1 pt2 "")
  (if (null (setq elist (tblsearch "style" "Times")))
    (command "_style" "Times" "Times.ttf" "0.0" "" "0.0" "" "")
  )
  (setvar "TEXTSTYLE" "Times")
  (setq dis (getvar "dimzin"))
  (setvar "dimzin" 1)
  (command "text"
           "ml"
           (list xx2 (+ y1 1.625))
           2
           0
           (strcat "X " (rtos x 2 3))
  )
  (command "text"
           "ml"
           (list xx2 (- y1 1.625))
           2
           0
           (strcat "Y " (rtos y 2 3))
  )
  (setvar "osmode" os)
  (setvar "dimzin" dis)
  (setvar "cmdecho" cmd)
  (command "_.UNDO" "_E")     ;****
  (princ)
)

[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-24 11:03:24 | 显示全部楼层
最初由 cdhua001 发布
[B]查了一下,应该是这句:
(setvar "osmode" os) [/B]

坐标标注的问题是解决了,可我的对象捕捉自动消失的问题还没解决,我将楼主这句话加在两个LISP文件中,都没反应,请楼主再帮助一下,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-28 09:23:34 | 显示全部楼层
最初由 柔柔 发布
[B]提供一下思路
1,你这个程序好像是把坐标点值写出来,那我要问你了,所谓坐标值就是相对于坐标原点的,如果你想人为定某个点为基准点,标出相对于这个基准点的“坐标”值就不行了。
所以,程序一开始要有一个“选?.. [/B]

输入样板文件名或 [.(表示无)] :.
正在重生成模型。
拾取需要标注的点:
拾取标注线起点:
字体文件不存在。未知命令“0.0”。按 F1 查看帮助。
未知命令“ZZ”。按 F1 查看帮助。
未知命令“0.0”。按 F1 查看帮助。
未知命令“ZZ”。按 F1 查看帮助。
未知命令“ZZ”。按 F1 查看帮助。
Error: AutoCAD 变量设置被拒绝: "TEXTSTYLE" "S2"
我的字体样式是S2,当新建文件样板文件名是“无”时,不能自动建立新字体样式S2,请问怎样解决这个问题?我都是复制一个S2样式的文字,然后再使用标注就正常了,就是麻烦一些,能不能将文字样式S2设置到样本“无”里面?
另外,标注坐标,能否加上设置比例,这样可在任意比例图形中实现自动标注,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-30 15:27:44 | 显示全部楼层
我看到那些密密麻麻的英文字,我头都晕了。还要看程序啊!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-29 01:10 , Processed in 0.211975 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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