找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2397|回复: 16

[求助] 自己编写的画保温层插件,但是有两个问题无法解决

[复制链接]
发表于 2014-4-11 08:26:14 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 开间奶茶店 于 2014-4-11 08:33 编辑
  1. ;;本程序用于墙身快速绘制保温层
  2. ;;只支持CAD2006及以上版本
  3. ;;欢迎转载但请保留注释信息,方便维护
  4. ;;以下为主程序
  5. (defun c:sw ()
  6.     ;获得vl函数库
  7.     (vl-load-com)
  8. ;判断是否有相关图层,如无建立
  9.     (setq pdlayon (tblsearch "layer" "A-FACE"))
  10.     (if (null pdlayon)
  11.         (command "-layer" "n" "A-FACE" "c" "6" "A-FACE" "")
  12.     )
  13.     (setq pdlayon (tblsearch "layer" "A-PUB_HATCH"))
  14.     (if (null pdlayon)
  15.         (command "-layer" "n" "A-PUB_HATCH" "c" "8" "A-PUB_HATCH" "")
  16.     )
  17.     ;画基准线
  18.     (command "_pline")
  19.     (while (/= "" (getvar "cmdnames")) ;判断是否在pline命令中
  20.         (command pause)
  21.     )
  22.     (setq jzx (ssget "L"))
  23.     (setq bwhd (getreal "请输入保温层厚度(默认30):"))
  24.     (if (null bwhd)
  25.         (setq bwhd 30)
  26.     )
  27.     (setq ptb (getpoint "请选择保温层所在一侧:"))
  28.     ;开始绘制第一条线
  29.     (command "offset" 10 jzx ptb "")
  30.     ;获取第一条线的参数,设置图层为"A-FACE",(二、三条无需设置)
  31.     (setq bwx1 (ssget "L"))
  32.     (setq oldlay (assoc 8 (entget(entlast))))
  33.     (setq newlay "A-FACE")
  34.     (entmod (subst (cons 8 newlay) oldlay (entget(entlast))))
  35.     (getplinept)
  36.     (setq bwx1_pts plb_s)
  37.     (setq bwx1_pte plb_e)
  38.     ;绘制第二条线
  39.     (command "offset" bwhd bwx1 ptb "")
  40.     ;获取第二条线的参数
  41.     (setq bwx2 (ssget "L"))
  42.     (getplinept)
  43.     (setq bwx2_pts plb_s)
  44.     (setq bwx2_pte plb_e)
  45.     ;画封闭线
  46.     (command "pline" bwx1_pts bwx2_pts "")
  47.     (setq fbx1 (ssget "L"))
  48.     (command "pline" bwx1_pte bwx2_pte "")
  49.     (setq fbx2 (ssget "L"))
  50.     ;绘制第三条线
  51.     (command "offset" 10 bwx2 ptb "")
  52.     (setq mcx (ssget "L"))
  53.     ;填充,修改填充图案图层
  54.     (command "hatch" "ANSI37" 100 0 "s" bwx1 bwx2 fbx1 fbx2 "")
  55.     (setq oldlay (assoc 8 (entget(entlast))))
  56.     (setq newlay "A-PUB_HATCH")
  57.     (entmod (subst (cons 8 newlay) oldlay (entget(entlast))))
  58.     ;清除作图痕迹
  59.     (command "erase" jzx fbx1 fbx2 "")
  60.     (princ)
  61. )
  62. ;;子程序getplinept,用于获得pline线的起点和终点
  63. (defun getplinept()
  64.     (setq plname(entlast))
  65.     (setq plname_vlax ( vlax-ename->vla-object plname))
  66.     (setq plzb_vlax (vla-get-Coordinates plname_vlax))
  67.     (setq plb_vlax (vlax-safearray->list (vlax-variant-value plzb_vlax)))
  68.     (setq plb_s (list (car plb_vlax) (cadr plb_vlax)))
  69.     (setq plb_e (reverse(list (car (reverse plb_vlax)) (cadr (reverse plb_vlax)))))
  70.     (princ)
  71. )
两个问题:
1.画图时提示输入保温层厚度的提示信息是乱码?
2.程序在大部分时间运行稳定(结果如左图),但是有时候会出现画线错误的情况(如中图、右图),目测貌似是将需要的一条保温线和辅助线弄错了,但是查了下代码似乎没问题?请大家答疑解惑

082651wzyqkhgmzmluu5lb.png     082650fgc9ur1jkxc3186u.png     082650b5b4yzxy5m14rd4i.png




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

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-4-11 09:10:10 | 显示全部楼层
1、(setq bwhd (getreal "\n请输入保温层厚度(默认30):"))
     (setq ptb (getpoint "\n请选择保温层所在一侧:"))
2、关闭捕捉

点评

额,两个问题都没解决…… 事实上我最早的时候代码确实有\n和:,但是同样会有乱码。 至于对象捕捉我尝试在取点前用命令 在最后再恢复 依旧没能正确的画出。 似乎绘图和填充错误只出现在我需要填充的  详情 回复 发表于 2014-4-11 09:54

评分

参与人数 1D豆 +5 收起 理由
xshrimp + 5 及时回复奖!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2014-4-11 09:54:51 | 显示全部楼层
牢固 发表于 2014-4-11 09:10
1、(setq bwhd (getreal "\n请输入保温层厚度(默认30):"))
     (setq ptb (getpoint "\n请选择保温层所 ...

额,两个问题都没解决……
事实上我最早的时候代码确实有\n和:,但是同样会有乱码。

至于对象捕捉我尝试在取点前用命令

  1. (setq dxbzz (getvar "osmode"))
  2. (setvar "osmode" 0)


在最后再恢复
  1. (setvar "osmode" dxbzz)


依旧没能正确的画出。
似乎绘图和填充错误只出现在我需要填充的某条边线长度很短(比如最早发现的时候pline线中有一段长度为65)
但是分析代码似乎和长度没有关联?

不管怎么样,谢谢!至少关闭对象捕捉是一个非常重要的功能,又学到了一点{:soso_e113:}。

点评

你把你程序里面的提示,拷贝粘贴到文本编辑器里面看看乱码不?  详情 回复 发表于 2014-4-11 11:44
在文字字串的开始和结束都要有E文,不要是中文!一般加个空格即可!  发表于 2014-4-11 11:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-4-11 11:44:54 | 显示全部楼层
开间奶茶店 发表于 2014-4-11 09:54
额,两个问题都没解决……
事实上我最早的时候代码确实有\n和:,但是同样会有乱码。

你把你程序里面的提示,拷贝粘贴到文本编辑器里面看看乱码不?

点评

没有……事实上我就是用Notepad++来编译的,那玩意儿本质上就是一个文本编辑器吧? 存储的文本的编码格式有没有要求?  详情 回复 发表于 2014-4-11 12:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-11 12:21:34 | 显示全部楼层
XDSoft 发表于 2014-4-11 11:44
你把你程序里面的提示,拷贝粘贴到文本编辑器里面看看乱码不?

没有……事实上我就是用Notepad++来编译的,那玩意儿本质上就是一个文本编辑器吧?
存储的文本的编码格式有没有要求?

点评

你试试粘贴到系统自带的NOTEPAD上看看。 没用过NOTEPAD++,你看看保存的时候,格式选的是什么?  详情 回复 发表于 2014-4-11 12:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-4-11 12:30:03 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2014-4-11 12:31 编辑

txt也有编码格式
offset可以保证成功?

点评

对,我现在其实也发现有这个问题,如果我第一次选择的点在我后面生成的两条pline线中间确实会有问题。 但是现在图上所出现的问题貌似和这个无关,特地选择了一个很远的点也会出现这种情况。  详情 回复 发表于 2014-4-11 14:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-4-11 12:32:51 | 显示全部楼层
开间奶茶店 发表于 2014-4-11 12:21
没有……事实上我就是用Notepad++来编译的,那玩意儿本质上就是一个文本编辑器吧?
存储的文本的编码格 ...

你试试粘贴到系统自带的NOTEPAD上看看。

没用过NOTEPAD++,你看看保存的时候,格式选的是什么?

点评

发现问题了,NOTEPAD++默认的不是ANSI,第一次写程序问题好多…… 现在就是生成错误的问题了,通过undo发现似乎是没能正常生成fbx2,于是bwx2躺枪了…… 但是看代码似乎又不应该,对象捕捉也关了啊……  详情 回复 发表于 2014-4-11 14:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-11 14:04:31 | 显示全部楼层
st788796 发表于 2014-4-11 12:30
txt也有编码格式
offset可以保证成功?

对,我现在其实也发现有这个问题,如果我第一次选择的点在我后面生成的两条pline线中间确实会有问题。
但是现在图上所出现的问题貌似和这个无关,特地选择了一个很远的点也会出现这种情况。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-11 14:31:03 | 显示全部楼层
XDSoft 发表于 2014-4-11 12:32
你试试粘贴到系统自带的NOTEPAD上看看。

没用过NOTEPAD++,你看看保存的时候,格式选的是什么?

发现问题了,NOTEPAD++默认的不是ANSI,第一次写程序问题好多……
现在就是生成错误的问题了,通过undo发现似乎是没能正常生成fbx2,于是bwx2躺枪了……
但是看代码似乎又不应该,对象捕捉也关了啊……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-4-11 17:07:09 | 显示全部楼层
开间奶茶店 发表于 2014-4-11 14:31
发现问题了,NOTEPAD++默认的不是ANSI,第一次写程序问题好多……
现在就是生成错误的问题了,通过undo ...

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

使用道具 举报

已领礼包: 9847个

财富等级: 富甲天下

发表于 2014-4-11 20:56:04 | 显示全部楼层
  1. ;;本程序用于墙身快速绘制保温层
  2. ;;只支持CAD2006及以上版本
  3. ;;欢迎转载但请保留注释信息,方便维护
  4. ;;以下为主程序
  5. (defun c:sw ()
  6.     ;获得vl函数库
  7.   (vl-load-com)
  8. (setq oldos (getvar "OSMODE"))
  9. ;判断是否有相关图层,如无建立
  10.   (setq pdlayon (tblsearch "layer" "A-FACE"))
  11.   (if (null pdlayon)
  12.     (command "-layer" "n" "A-FACE" "c" "6" "A-FACE" "")
  13.   )
  14.   (setq pdlayon (tblsearch "layer" "A-PUB_HATCH"))
  15.   (if (null pdlayon)
  16.     (command "-layer" "n" "A-PUB_HATCH" "c" "8" "A-PUB_HATCH" "")
  17.   )
  18.     ;画基准线
  19.   (command "_pline")
  20.   (while (> (getvar "cmdactive") 0) ;判断是否在命令中
  21.     (command pause)
  22.   )
  23. (setvar "CMDECHO" 0)
  24. (setvar "OSMODE" 0)
  25.   (setq jzx (entlast))
  26.   (setq bwhd (getreal "\n 请输入保温层厚度<30>: "))
  27.   (if (null bwhd) (setq bwhd 30))
  28.   (setq ptb (getpoint "\n 请选择保温层所在一侧: "))
  29.     ;开始绘制第一条线
  30.   (command "offset" 10 jzx ptb "")
  31.     ;获取第一条线的参数,设置图层为"A-FACE",(二、三条无需设置)
  32.   (setq bwx1 (entlast))
  33.   (setq oldlay (assoc 8 (entget bwx1)))
  34.   (setq newlay "A-FACE")
  35.   (entmod (subst (cons 8 newlay) oldlay (entget bwx1)))
  36.   (getplinept)
  37.   (setq bwx1_pts plb_s)
  38.   (setq bwx1_pte plb_e)
  39.     ;绘制第二条线
  40.   (command "offset" bwhd bwx1 ptb "")
  41.     ;获取第二条线的参数
  42.   (setq bwx2 (entlast))
  43.   (getplinept)
  44.   (setq bwx2_pts plb_s)
  45.   (setq bwx2_pte plb_e)
  46.     ;画封闭线
  47.   (command "pline" bwx1_pts bwx2_pts "")
  48.   (setq fbx1 (entlast))
  49.   (command "pline" bwx1_pte bwx2_pte "")
  50.   (setq fbx2 (entlast))
  51.     ;绘制第三条线
  52.   (command "offset" 10 bwx2 ptb "")
  53.   (setq mcx (entlast))
  54.     ;填充,修改填充图案图层
  55.   (command "hatch" "ANSI37" 100 0 bwx1 bwx2 fbx1 fbx2 "")
  56.   (setq oldlay (assoc 8 (entget(entlast))))
  57.   (setq newlay "A-PUB_HATCH")
  58.   (entmod (subst (cons 8 newlay) oldlay (entget(entlast))))
  59.     ;清除作图痕迹
  60.   (command "erase" jzx fbx1 fbx2 "")
  61. (setvar "OSMODE" oldos)
  62. (setvar "CMDECHO" 1)
  63.   (princ)
  64. )
  65. ;;子程序getplinept,用于获得pline线的起点和终点
  66. (defun getplinept()
  67.   (setq plname (entlast))
  68.   (setq plname_vlax (vlax-ename->vla-object plname))
  69.   (setq plzb_vlax (vla-get-Coordinates plname_vlax))
  70.   (setq plb_vlax (vlax-safearray->list (vlax-variant-value plzb_vlax)))
  71.   (setq plb_s (list (car plb_vlax) (cadr plb_vlax)))
  72.   (setq plb_e (reverse(list (car (reverse plb_vlax)) (cadr (reverse plb_vlax)))))
  73.   (princ)
  74. )

点评

想问下这个命令 (setvar "CMDECHO" 0) 的作用?  详情 回复 发表于 2014-4-14 10:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-4-11 21:44:33 | 显示全部楼层
哪里可以下载啊 ,谢谢版主了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-14 10:41:52 | 显示全部楼层

想问下这个命令
(setvar "CMDECHO" 0)
的作用?

点评

提高程序运行速度。  详情 回复 发表于 2014-4-14 11:43
让通过command函数执行的命令的提示文本信息不在屏幕上回显。  详情 回复 发表于 2014-4-14 10:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2014-4-14 10:59:06 | 显示全部楼层
开间奶茶店 发表于 2014-4-14 10:41
想问下这个命令
(setvar "CMDECHO" 0)
的作用?

让通过command函数执行的命令的提示文本信息不在屏幕上回显。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9847个

财富等级: 富甲天下

发表于 2014-4-14 11:43:23 | 显示全部楼层
开间奶茶店 发表于 2014-4-14 10:41
想问下这个命令
(setvar "CMDECHO" 0)
的作用?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 09:26 , Processed in 0.345439 second(s), 69 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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