iCAx开思工具箱

标题: 请大虾们帮忙看看 [打印本页]

作者: poncho_wang    时间: 2004-8-3 18:07
标题: 请大虾们帮忙看看
UG里面有可能用二次开发做到,在里面画一条线,刚画结束,就可以立即捕获到这条线的参数吗?
  
偶得毕业设计要实现有关这方面的东西,可是偶连UG都不会用,就这样赶鸭子
上阵了,以前AutoCAD的objectARX是可以办到这一点的,不知道UG里面可以吗?真心得谢过先。//bow
作者: guxiongfei    时间: 2004-8-3 18:12
UF_CURVE_****
作者: poncho_wang    时间: 2004-8-3 18:19
我的意思是,可以立马捕获里面的参数阿
就是说能不能做个dll在UG一直运行,监测着UG,如果UG里面一画一条直线结束,这个直线的参数便立马捕捉下来,写到文件里面去。
作者: 深夜摔键盘    时间: 2004-8-4 01:15
你说的那种应该是可以做的,但那不属二次开发的范围。去查查API拦截的资料可能会有帮助。但那样做,没什么意义,纯粹是和UG过不去。
还有一种笨方法,就是写一个死循环,不断遍历UG part中的对象,凡是直线或曲线对象,根据ID,ask其参数。
最笨的方法:UG中,画线的函数无非那几种,完全可以自己做一个模块,自己画线,自己记录就可以了。
作者: poncho_wang    时间: 2004-8-4 08:42
嗬嗬,谢谢老兄
其实偶也知道这种是没有什么意义的:-)可是偶现在需要实现的是在UG里面画一条直线,能够立马在另一台机器上的另一种CAD(我这里用的是AutoCAD)里面让它显现出来。用Windows的hook是可以捕捉到鼠标的消息,可是无法区分什么时候直线刚好画完阿。
你说的死循环偶也想过,就是遍历整个模型是吧。
while(1){
          遍历整个模型{
                  if(isALine) 捕获参数;
          }
}
  
可是对于画第一条直线,可以捕获,如果我再画一条直线,那上面这种肯定是不可以的了。
  
我不知道UG里面是否可以遍历模型里面各个部分的ID,这样可以通过是否新增了一个ID,然后根据ID来判断是否是直线,然后获得参数
这样的话还存在一个问题,就是如果我对自己画的一条直线进行修改
我怎样才能在dll里面知道我对一条它进行了修改呢?
  
谢谢指教阿,我里面对UG方面的描述可能不正确,比方说什么模型阿,ID之类的,偶一点都没有用过UG,请见谅:-)
作者: poncho_wang    时间: 2004-8-4 08:56
我现在集中的问题是:
1)当只在UG中进行的简单的操作,例如画一条线、圆、弧之类,二次开发中有没有函数可以获得,这些这些线阿、圆阿的个数n,这样我便可以在循环中检测这个N,如果n发生变化,肯定进行了新的操作,这样便可以获得这个新操作所画对象的参数。
while(1){
        获得N;( 能否通过遍历数据库取得对象个数n)?
         if(N changed){
               找到这个新增加的对象    的ID,然后获取参数;
         }
}
  
2)还有就是一个修改的问题,我实在是无法知道我何时对一条直线进行了修改:-(
  
哪位能够帮忙的话,偶请客,偶在上海
作者: huashanyjj    时间: 2004-8-4 09:41
可以使用动态链接库,时时检测对象的数量和tag(不用hook),如果对象增加(之前没有删除),new tag出现,然后检测类型,是线圆,弧等,最后写入一个文件。
修改的话,如果不是特别的,就把以前记录的对象保存起来,没有需要重新检测参数,改变的话,重新写入。
作者: poncho_wang    时间: 2004-8-4 09:59
那么如何检测对象的数量和tag阿,偶找不到资料参考。
还有关于修改,怎样才叫把以前的对象保存起来阿,比方说UG画了一条直线1,然后对他修改(比方说就移动一下),dll里面怎样检测到这条修改的直线的ID呢?我是说实时的检测到
  
谢谢
作者: huashanyjj    时间: 2004-8-4 11:01
见ugopen帮助(ug自带):使用uf_obj.h
中遍历对象的函数uf_obj_cycle_all,UF_OBJ_cycle_objs_in_part等,
检查是否有新对象和对象是否改变,使用timer实时检测。
作者: poncho_wang    时间: 2004-8-4 11:55
那么请问我判断对象是否改变
难道也是遍历整个模型
看看每个对象参数是否改变吗?
这样岂不是太慢了啊。。
  
请指教
作者: 深夜摔键盘    时间: 2004-8-4 14:35
照你说的情况来看,似乎只能用API HOOK了。
API HOOK,不是你说的拦截鼠标消息,而是要检测并拦截系统调用OPEN API,因为UG中的各模块也是分成了DLL,运行时加载。你可以在UG调用各建模操作之前,拦截画线的函数,一旦UG开始调用这些API时,就可以运行你自定义的功能了
作者: poncho_wang    时间: 2004-8-4 14:38
hook好像不能做到这一点吧。。
总共好像就十三种hook吧(MFC)我大部分都用过啊。。
作者: huashanyjj    时间: 2004-8-4 14:42
其实这样做也不会影响什么速度。如果模型真的很复杂,那可能会慢一些,由于你只是遍历固定类型的对象,我认为不会变慢,而且还可以采用一些方法来提高遍历的速度,比如将后来画的线圆弧加上标记,这样可以节省遍历的时间。以当前机器的水平,应该很快(除非你的机器还是p3)。
作者: 深夜摔键盘    时间: 2004-8-4 14:44
能。如果你熟悉API的调用机理,就知道该怎么搞了。
我这,有一个拦截WINDOWS API的一个例子,拦截了GDI模块中的TextOut,你可以参考一下。UG API的道理和WINDOWS API应该没啥区别。你摸索着看看,要是搞出来了,公布个简单源码最好。原来我想测试的,一直没时间
作者: poncho_wang    时间: 2004-8-4 14:47
先谢过:-)
对乐,顺便问一下
利用UG OPEN API直接画一条直线怎么写啊。
extern "C" DllExport void ufsta( char *param, int *returnCode, int rlen )
{
    /* Initialize the API environment */
    int errorCode = UF_initialize();
  
    if ( 0 == errorCode )
    {
        /* TODO: Add your application code here */
  
  UF_CURVE_line_t sline1;
  tag_t line1;
  
  sline1.start_point[0] = 0.0;
  sline1.start_point[1] = 0.0;
  sline1.start_point[2] = 0.0;
  sline1.end_point[0] = 0.0;
  sline1.end_point[1] = 1.0;
  sline1.end_point[2] = 0.0;
  
     UF_CURVE_create_line([$sline1,&line1)]
我就这么随便试了一下,好像看不到直线嘛
作者: 深夜摔键盘    时间: 2004-8-4 14:50
线太短,放大视图看看
作者: poncho_wang    时间: 2004-8-4 14:54
不是太短不太短阿
是UG根本就处于什么都没打开的界面
就是仍然是刚刚打开时的界面
还有什么“您知道吗”这种提示的界面
作者: tari    时间: 2004-8-4 14:55
没有打开part的缘故?
作者: poncho_wang    时间: 2004-8-4 14:58
请问你有没有代码阿,偶真是一点都没写过UG二次开发的冬冬,头都大了。。嘿嘿
  
画直线一定要先创建一个part吗?
作者: 深夜摔键盘    时间: 2004-8-4 15:01
UG的PART说它是文件也好,说它是个数据库也好,,,几何对象都在PART中。
应该先学学UG呀,要不,找函数都困难!
作者: poncho_wang    时间: 2004-8-4 15:09
键盘兄,刚刚看了你给我的代码。
原来我们说的hook不是一个概念上的哦:-)
  
我想你的意思应该是,我拦截UG的
这种修改函数,这样UG里面一修改我便可以追踪得到,对巴
  
不过UG本身操作时候所调用的函数难道会和OPEN API里面的函数一致吗?
  
我的意思是 它提供给我们开发的API与它本身实现所用的函数不是一样的。如果这样的话便没有办法
截获得到了,对吧。
  
偶没有试过,不过偶想应该会不一样的吧,你说呢
作者: 深夜摔键盘    时间: 2004-8-4 15:11
不可能不一样。DLL输出的函数,就是咱们用的API。名称是一样的,首先要找到它的调用地址,然后修改入口,先跳到你的程式中。
作者: poncho_wang    时间: 2004-8-4 15:14
好的。偶会试试的。:-)
没有你们这些人帮忙偶还真是无所适从呢。
  
感谢非常//bow




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3