明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3805|回复: 15

[反应器 回调函数]今天发一个文字避让的回调函数源码!求交流思路

[复制链接]
发表于 2013-5-7 18:21 | 显示全部楼层 |阅读模式

此反应器回调函数实现目的是:如果一个附着该反应器的文字移动或者修改内容后压到别的文字,则移开那个被压到的文字。
思路:通过ssget选择以文字四角所围成的区域的文字,若返回选择集为空nil则没有碰撞,否则计算被压倒的文字新坐标并移开文字到新坐标。
反应器使用ssget这样的交互函数是禁止的,但是我想不到更好的搜索算法来检查是否碰撞,所以里面的ssget函数参数都是预定义好的而不是用户交互输入的。
希望高手指点下改进方法,有个问题请教就是在反应器(第一次)触发后 while循环没法完全执行就退出了并又触发(第二次)反应器的执行,所以文字移动不到想要的位置,求教大神是什么原因......
  1. (defun RCBF:obj-delete-text(owner_obj reactor_obj  arg_list / m_ename pt_10 ang_50 ucs_dir pt1 pt2 pt3 pt4 b h pt_list ss tmp)
  2.   (princ "\n.\n反应器开始执行...")  
  3.   (setq m_ename (vlax-vla-object->ename  owner_obj))  
  4.   ;;碰撞检查start
  5.   (setq pt_10 (getitern m_ename 10) ang_50 (getitern m_ename 50) ucs_dir (append pt_10 (list ang_50)))
  6.   (setq pt1 (textbox (entget m_ename)) pt3 (cadr pt1)  pt1 (car pt1) b (car pt3) h (cadr pt3))
  7.   (setq pt2 (polar pt1 0.0 b) pt4 (polar pt1 (/ pi 2.0) h) pt_list (list pt1 pt2 pt3 pt4))
  8.   (setq pt_list (mapcar (function(lambda(x)(trans (trans-ucs-obj->w x ucs_dir) 0 1))) pt_list))
  9.   (if (setq ss (ssget "_CP" pt_list '((0 . "TEXT"))))
  10.     (if (setq tmp (ssdel m_ename ss)) (setq ss tmp))
  11.     )  
  12.   ;;碰撞检查end
  13.   
  14.   (if ss  (princ (strcat "\n文字碰撞:" (getitern (ssname ss 0) 1)))(princ "\n没有碰撞到文字..."))
  15.   (if ss (progn
  16.   (setq m_text (ssname ss 0)
  17.   m_text_10 (getitern m_text 10)
  18.   m_text_50 (getitern m_text 50)
  19.   m_text_40 (getitern m_text 40)
  20.   pt_text_1 (textbox (entget m_text))
  21.   pt_text_3 (cadr pt_text_1)  pt_text_1 (car pt_text_1)
  22.   pt_text_2 (polar pt_text_1 0.0 (car pt_text_3))
  23.   pt_text_4 (polar pt_text_1 (/ pi 2.0) (cadr pt_text_3))
  24.   pt_text_list (list pt_text_1 pt_text_2 pt_text_3 pt_text_4)
  25.   pt_end1 m_text_10 pt_end2 m_text_10 right_times 0 left_times 0)
  26.   (while  ;;计算在碰撞后向右移动多少次可以不再碰撞
  27.    (setq pt_start pt_end1 pt_end1 (polar pt_start m_text_50 m_text_40)
  28.   right_times (1+ right_times)
  29.   ucs_text_dir (append pt_end1 (list m_text_50))
  30.   pt_text_list (mapcar (function(lambda(x)(trans (trans-ucs-obj->w x ucs_text_dir) 0 1))) pt_text_list)
  31.   ss_1 (ssget "_CP" pt_text_list '((0 . "TEXT")))
  32.   )
  33.    (princ "\nR移动次数:")(princ right_times)
  34.    (princ "\nss_1=")(princ ss_1)
  35.    (princ "\n图原名=")(princ (getitern (ssname ss_1 0) -1))
  36.    )
  37.   (while
  38. ;;计算在碰撞后向左移动多少次可以不再碰撞
  39.    (setq pt_start pt_end2 pt_end2 (polar pt_start (+ m_text_50 pi) m_text_40)
  40.   left_times (1+ left_times)
  41.   ucs_text_dir (append pt_end2 (list m_text_50))
  42.   pt_text_list (mapcar (function(lambda(x)(trans (trans-ucs-obj->w x ucs_text_dir) 0 1))) pt_text_list)
  43.   ss_2 (ssget "_CP" pt_text_list '((0 . "TEXT")))
  44.   )
  45.    (princ "\nL移动次数:")(princ left_times)
  46.    (princ "\nss_2=")(princ ss_2)
  47.    (princ "\n图原名=")(princ (getitern (ssname ss_2 0) -1))
  48.    )
  49.   (if (<= right_times left_times)(upobj m_text 10 pt_end1)(upobj m_text 10 pt_end2))    ;;根据向左或是向右移动次数判断向左还是右移动
  50.   (princ)
  51.   ))
  52.   ;(upobj m_text 10 pt_end)
  53.   (princ "\n反应器执行结束...\n.")
  54.   )
发表于 2013-5-8 10:40 | 显示全部楼层
这么好的东西为什么没人顶呢
 楼主| 发表于 2013-5-8 12:33 | 显示全部楼层
yaokui25 发表于 2013-5-8 10:40
这么好的东西为什么没人顶呢

哈哈  反应器 这个东西 说难不难 说简单又不简单 会用的人比较少呢...只有自己顶了...
发表于 2013-5-8 23:35 | 显示全部楼层
还没会用反应器,留个脚印
发表于 2013-5-12 00:53 | 显示全部楼层
留个爪印,想弄个跟qleader相似的东东,正好学习一下
发表于 2013-5-12 09:44 | 显示全部楼层
准备学习反应器了!
发表于 2013-5-12 11:03 | 显示全部楼层
这么好的东西为什么没人顶呢,期待完善
发表于 2013-5-12 15:56 | 显示全部楼层
好东西,,,要看一下,,,
发表于 2013-6-30 22:40 | 显示全部楼层
在反应器上附加数据,在回调函数开始的时候检查反应器的附加数据,如果是反应器修改引起的修改则推出反应器程序,,,,,,,
发表于 2013-7-23 22:22 | 显示全部楼层
楼主您好,不知道您的问题是否解决了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-12 06:33 , Processed in 0.175939 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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