明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: cheng5276

请教如何获取夹点编辑的当前图元?

  [复制链接]
发表于 2012-4-22 08:32:33 | 显示全部楼层
恩,楼主,,,很厉害,前途无限呢!呵呵
回复

使用道具 举报

发表于 2012-4-24 19:58:06 | 显示全部楼层
本帖最后由 Gu_xl 于 2012-4-24 21:22 编辑

解决方案源码:
  1.   ;;命令反应器
  2.   (or *cmdvlr*
  3.       (setq *cmdvlr* (vlr-command-reactor nil '((:vlr-commandWillStart . cmdstart) (:VLR-commandEnded . cmdEnd))))
  4.       )
  5.   ;;数据库反应器
  6.   (or *acdbvlr*
  7.       (setq *acdbvlr* (vlr-acdb-reactor nil
  8.        '((::VLR-objectModified . acdbstart))))
  9.       )
  10. ;;命令开始反应器回调函数
  11. (defun cmdstart (vlr lst)
  12.   (if (= "GRIP_STRETCH" (car lst))
  13.     (setq *GRIP_STRETCH_Start* t ;_ 设置启动夹点拖拽命令标志
  14.           *GRIP_STRETCH_Obj* nil ;_ 清空夹点拖拽的对象图元名列表
  15.           )
  16.     )
  17.   )
  18. ;;命令结束反应器回调函数
  19. (defun cmdEnd (vlr lst )
  20.   (if (= "GRIP_STRETCH" (car lst))
  21.     (progn
  22.       (setq *GRIP_STRETCH_Start* nil) ;_ 清除启动夹点拖拽命令标志
  23.       ;;此处可自行添加对 *GRIP_STRETCH_Obj* 处理的代码,如将夹点拖拽物体颜色变红
  24.      (mapcar '(lambda (x) (vla-put-color (vlax-ename->vla-object x) 1)) *GRIP_STRETCH_Obj*)
  25.     )
  26.   )
  27. )
  28. ;;数据库反应器回调函数
  29. (defun acdbstart (vlr obj)
  30.   (if *GRIP_STRETCH_Start*
  31.     (setq *GRIP_STRETCH_Obj*
  32.            (append *GRIP_STRETCH_Obj* (cdr obj)) ;_ 夹点拖拽的对象图元名列表
  33.     )
  34.   )
  35. )



回复

使用道具 举报

发表于 2012-4-24 20:05:54 | 显示全部楼层
gu版这么快就有答案了,顶!
回复

使用道具 举报

 楼主| 发表于 2012-4-24 21:50:10 | 显示全部楼层
本帖最后由 cheng5276 于 2012-4-24 22:01 编辑

本想能够在“夹点拉伸”命令执行前按特定对象执行特定操作。
(vlr-command-reactor nil '((:vlr-commandWillStart . 回调函数A)))  ;此回调函数最先执行
(vlr-object-reactor nil nil '((:vlr-modified . 回调函数B))) ;此函数虽可获得夹点拉伸的图元,但此回调函数后执行,故无法将获取的图元传递给函数A
只能在commandWillStart函数中通过如下方式去近似取得
(defun AA (pt)
(IF (NOT PT) (SETQ PT (CADR (GRREAD 1 7 0))))
(SETQ PICK_BAK (GETVAR "PICKBOX") ST T PICK_0 PICK_BAK)
)
(WHILE ST
(SETQ S1 (CAR (LAST (nentselp pt))))
(if s1
(setq st nil)
(setvar "pickbox"   pick_0)
)
(setq PICK_0  (1+ pick_0))
)
(setvar "pickbox" PICK_BAK)
s1
)
回复

使用道具 举报

 楼主| 发表于 2012-4-24 21:56:01 | 显示全部楼层
本帖最后由 cheng5276 于 2012-4-24 21:58 编辑
Gu_xl 发表于 2012-4-24 19:58
解决方案源码:
**** 本内容被作者隐藏 ****

多谢古版,可惜还是无法实现我的变态的要求,古版与danxingpen的方式,英雄所见,基本相同,佩服
回复

使用道具 举报

发表于 2012-4-24 21:58:21 来自手机 | 显示全部楼层
能详细说说想要执行什么操作么?
回复

使用道具 举报

发表于 2012-4-25 08:48:21 | 显示全部楼层
看看高手是如何做到的
回复

使用道具 举报

 楼主| 发表于 2012-4-25 11:18:37 | 显示全部楼层
本帖最后由 cheng5276 于 2012-4-25 11:31 编辑

因程序分支太多,以下仅列出程序的框架,大侠们应该就能知道我的真实目的了,肯请不吝赐教啊
  1. ;++++++++++通用命令反应器框架++++++++++++++
  2. (vl-load-reactors);加载反应器库
  3. (if (not c5276_command_reactor) (setq c5276_command_reactor (vlr-command-reactor nil
  4. '((:vlr-commandWillStart . cheng5276_command_callbacks1) ;即将执行
  5. (:vlr-commandEnded . cheng5276_command_callbacks2) ;执行完毕
  6. (:vlr-commandCancelled . cheng5276_command_callbacks3) ;取消执行
  7. (:vlr-commandFailed . cheng5276_command_callbacks4)  ;执行失败
  8. )
  9. )
  10. )
  11. )

  12. ;1、命令执行前
  13. (defun cheng5276_command_callbacks1 (a b / cmdname obj pt_now pt0 sc ss str x)
  14. (setq c5276_cmdname (strcase (car b)))
  15. (if (setq ss (ssget "P"))
  16. (progn
  17. (setq len (sslength ss))
  18. (if (= len 1)
  19. (setq c5276_command_s1 (ssname ss 0))
  20. ;关键就是如何获取下面这个正处于编辑状态(如夹点拉伸、文字在位编辑等命令时)的图元;
  21. ;本cheng5276_command_callbacks1的执行过程也无法通过对象修改反应器(修改前模式)去替代。
  22. ;此模式下的对象反应器,虽可取得夹点图元,却无法获取图元的任何特性,也就无法分类。同时此回调函数 比命令反应器(命令执行前的回调函数)后执行,故无法把该图元传递给命令反应器。
  23. ;目前我只能通过这个近似的方式去取得。请大侠指点有没有更合适、精确的方式(CAD要是有个专门的系统变量能直接取得多好)
  24. (setq c5276_command_s1 (cheng5276-near-pt-en PT));近似取得正处于夹点编辑状态的图元
  25. )
  26. (setq c5276-objstyle (vlax-ldata-GET (A->obj c5276_command_s1)  "cheng5276_objstyle")) ;取自定的对象扩展数据对象类型
  27. )
  28. (setq c5276_command_s1 nil)
  29. )
  30. ;++++++++++++++++++++++++++++++++++++
  31. ;++++++++++++命令总分类开始++++++++++
  32. ;++++++++++++++++++++++++++++++++++++
  33. (cond
  34. ;******************开始命令A*************************
  35. ((AND c5276_command_s1 (= c5276_cmdname "命令A"));
  36. (cond ;按自定义类型进一步细分
  37. ((wcmatch c5276-objstyle "类型a")
  38. (执行 A1 过程)
  39. )
  40. ((wcmatch c5276-objstyle "类型b")
  41. (执行 A2 过程)
  42. )
  43. .....................
  44. )
  45. )
  46. ;******************结束命令A*************************

  47. ;******************开始命令B*************************
  48. ((AND c5276_command_s1 (= c5276_cmdname "命令B")) ;
  49. (cond ;按自定义类型进一步细分
  50. ((wcmatch c5276-objstyle "类型c")
  51. (执行 B1 过程)
  52. )
  53. ((wcmatch c5276-objstyle "类型d")
  54. (执行 B2 过程)
  55. )
  56. .....................
  57. )
  58. )
  59. ;******************结束命令B************************
  60. )
  61. ;++++++++++++++++++++++++++++++++++++
  62. ;++++++++++++命令总分类结束++++++++++
  63. ;++++++++++++++++++++++++++++++++++++
  64. (princ)
  65. )



  66. ;2、命令执行完毕后
  67. (defun cheng5276_command_callbacks2 (a b / aa att attobjlst cmdname obj pos_x pt_in pt_in_x ptnow sc st sta stb)
  68. ;++++++++++++命令总分类开始++++++++++
  69. (cond
  70. ;******************开始命令A*************************
  71. ((AND c5276_command_s1 (= c5276_cmdname "命令A"));
  72. (cond ;按自定义类型进一步细分
  73. ((wcmatch c5276-objstyle "类型a")
  74. (执行 A1 过程)
  75. )
  76. ((wcmatch c5276-objstyle "类型b")
  77. (执行 A2 过程)
  78. )
  79. .....................
  80. )
  81. )
  82. ;******************结束命令A*************************

  83. ;******************开始命令B*************************
  84. ((AND c5276_command_s1 (= c5276_cmdname "命令B")) ;
  85. (cond ;按自定义类型进一步细分
  86. ((wcmatch c5276-objstyle "类型c")
  87. (执行 B1 过程)
  88. )
  89. ((wcmatch c5276-objstyle "类型d")
  90. (执行 B2 过程)
  91. )
  92. .....................
  93. )
  94. )
  95. ;******************结束命令B************************
  96. )
  97. ;++++++++++++命令总分类结束++++++++++
  98. (princ)
  99. )


  100. ;取得点所在处的图元对象(近似法,当交叠图元较多时,所获取的对象与绘图次序有关)
  101. ;该函数无法用于DBX模式
  102. (defun cheng5276-near-pt-en (pt / pick_0 pick_bak s1 lst)
  103. (if (not pt) (setq pt (cadr (grread 1 7 0))))
  104. (SETQ PICK_BAK (Getvar "pickbox")  pick0  PICK_BAK)
  105. (Setvar "pickbox" 0)
  106. (WHILE (NOT (setq lst (nentselp PT)))
  107. (setq pick0  (1+ PICK_0))
  108. (Setvar "pickbox" pick0)
  109. )
  110. (if (> (length lst) 2) ;当对象为块或标注等复合对象时
  111. (setq s1 (car (last lst)))
  112. (setq s1 (car lst))
  113. )
  114. (Setvar "pickbox" PICK_BAK)
  115. S1
  116. )





回复

使用道具 举报

发表于 2012-4-25 11:48:11 | 显示全部楼层
cheng5276 发表于 2012-4-25 11:18
因程序分支太多,以下仅列出程序的框架,大侠们应该就能知道我的真实目的了,肯请不吝赐教啊

程序太长,懒得看,也不知你的最终目是想干什么!你最好用语言描述你的想法!
首先给你明确几点:
1、当夹点命令启动的同时,夹点对象就处于保护状态,尽管你可以获取该对象,但你无法对夹点对象进行任何操作!直到夹点命令结束!
2、夹点命令还没启动时,你更无从得知夹点命令要夹取哪个对象!

点评

呵呵,GU版总结的是,我就是在这个结这里栽掉了。  发表于 2012-4-25 20:17
回复

使用道具 举报

发表于 2012-4-26 08:35:39 | 显示全部楼层
其实那个什么花园程序看一遍,,,,,你就知道任何我们要做的事情都应该在命令结束后进行,在命令反应器前进行对象的原数据的读取保存,在命令结束反应器里面进行被修改的数据的读取,然后根据两个结果来进行我们的修改.,,,基本法则问题,,,
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-21 04:11 , Processed in 0.153912 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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