iCAx开思工具箱

标题: 精确包容体(附grip源码) [打印本页]

作者: zhangcanwei    时间: 2009-5-8 16:22
标题: 精确包容体(附grip源码)
这些年老是有人在说什么最大盒子、包容体的事情。这很重要吗?可能我不做塑胶模体会不到。现发上一个程序,回报网络。

ENTITY/objct(90000),objct1,objct2,CSYS1
ENTITY/P1,P2,P3
ENTITY/x_plan,xplan,y_plan,yplan,z_plan,zplan
$$这些分别表示三个坐标轴的正负向的平面
NUMBER/selrsp,indrsp,xPt,yPt,zPt
NUMBER/x_mPt,xmPt,y_mPt,ymPt,z_mPt,zmPt,x_max,y_max,z_max
NUMBER/xmax,ymax,zmax,xmin,ymin,zmin
$$表示实体上面的六个极点数据等
NUMBER/inidst,mindst(7)
NUMBER/sign
NUMBER/numobj,numstp
inidst=50000
$$表示把六个定位平面放到工作坐标系的远处
$$ins10:
$$GPOS/'Indicate WCS',xPt,yPt,zPt,indrsp
$$IF/indrsp==1,JUMP/ins10:
$$P1=POINT/xPt,yPt,zPt
$$P2=POINT/xPt+50,yPt,zPt
$$P3=POINT/xPt,yPt+50,zPt
$$CSYS1=CSYS/P1,P2,P3,ORIGIN,P1
$$&WCS=CSYS1
$$&WCSDRW=&YES
$$DELETE/P1,P2,P3
$$xPt=0
$$yPt=0
$$zPt=0
$$ &WCS=&ABS
$$下面创建六个平面
x_plan=PLANE/YZPLAN,-inidst
xplan=PLANE/YZPLAN,inidst
y_plan=PLANE/XZPLAN,-inidst
yplan=PLANE/XZPLAN,inidst
z_plan=PLANE/XYPLAN,-inidst
zplan=PLANE/XYPLAN,inidst
ins2:
MASK/OMIT,10,14,15,25,26,29,45,196,197
$$上面把一些不能用于距离判断的OBJECT滤去
IDENT/'Select an object',objct,CNT,numobj,selrsp $$选择目标体
IF/selrsp==1,JUMP/ins2:
IF/selrsp==2,JUMP/idover:
IF/numobj==0,JUMP/idover:
mindst=RELDST/x_plan,objct(1)
xmin=mindst(4)
mindst=RELDST/xplan,objct(1)
xmax=mindst(4)
mindst=RELDST/y_plan,objct(1)
ymin=mindst(5)
mindst=RELDST/yplan,objct(1)
ymax=mindst(5)
mindst=RELDST/z_plan,objct(1)
zmin=mindst(6)
mindst=RELDST/zplan,objct(1)
zmax=mindst(6)
$$下面求出最小值
DO/overdo:,numstp,1,numobj,1
    mindst=RELDST/x_plan,objct(numstp)
    x_mPt=mindst(4)
    IF/xmin>x_mPt,xmin=x_mPt
    mindst=RELDST/xplan,objct(numstp)
    xmPt=mindst(4)
    IF/xmax<xmPt,xmax=xmPt
    mindst=RELDST/y_plan,objct(numstp)
    y_mPt=mindst(5)
    IF/ymin>y_mPt,ymin=y_mPt
    mindst=RELDST/yplan,objct(numstp)
    ymPt=mindst(5)
    IF/ymax<ymPt,ymax=ymPt
    mindst=RELDST/z_plan,objct(numstp)
    z_mPt=mindst(6)
    IF/zmin>z_mPt,zmin=z_mPt
    mindst=RELDST/zplan,objct(numstp)
    zmPt=mindst(6)
    IF/zmax<zmPt,zmax=zmPt
overdo:
x_mPt=xmin
y_mPt=ymin
z_mPt=zmin
xmPt=xmax
ymPt=ymax
zmPt=zmax
$$objct1 = SOLBLK/ORIGIN,x_mPt,y_mPt,z_mPt,SIZE,xmPt-x_mPt,ymPt-y_mPt,zmPt-z_mPt
DELETE/x_plan
DELETE/y_plan
DELETE/z_plan
DELETE/xplan
DELETE/yplan
DELETE/zplan
$$删除六个参考平面

$$------下面是圆整程序
$$xPt=(x_mPt+xmPt)/2
$$yPt=(y_mPt+ymPt)/2
$$zPt=z_mPt
$$IFTHEN/xPt>=0
$$    sign=1
$$ELSE
$$    sign=-1
$$ENDIF
$$xPt=sign*INTF(100*(ABSF(xPt))+0.5)/100
$$IFTHEN/yPt>=0
$$    sign=1
$$ELSE
$$    sign=-1
$$ENDIF
$$yPt=sign*INTF(100*(ABSF(yPt))+0.5)/100
$$IFTHEN/zPt>=0
$$    sign=1
$$ELSE
$$    sign=-1
$$ENDIF
$$zPt=sign*INTF(100*ABSF(z_mPt)+0.5)/100
$$x_max=INTF(100*ABSF(MAXF(absf(xPt-x_mPt),absf(xPt-xmPt))+0.5))/100
$$y_max=INTF(100*ABSF(MAXF(absf(yPt-y_mPt),absf(yPt-ymPt))+0.5))/100
$$z_max=INTF(100*ABSF(MAXF(absf(zPt-z_mPt),absf(zPt-zmPt))+0.5))/100
$$------以上是圆整程序,对底面中心点圆整到小数点后2位,并求出最大的半长度圆整值

IFTHEN/xmPt-x_mPt==0
    MESSG/'X Axis size of The block is wrong'
    JUMP/idover:
ENDIF
IFTHEN/ymPt-y_mPt==0
    MESSG/'Y Axis size of The block is wrong'
    JUMP/idover:
ENDIF
IFTHEN/zmPt-z_mPt==0
    MESSG/'Z Axis size of The block is wrong'
    JUMP/idover:
ENDIF
objct1 = SOLBLK/ORIGIN,x_mPt,y_mPt,z_mPt,SIZE,xmPt-x_mPt,ymPt-y_mPt,zmPt-z_mPt
xPt=(x_mPt+xmPt)/2
yPt=(y_mPt+ymPt)/2
zPt=z_mPt
P1=POINT/xPt,yPt,zPt
P2=POINT/xPt+50,yPt,zPt
P3=POINT/xPt,yPt+50,zPt
CSYS1=CSYS/P1,P2,P3,ORIGIN,P1
&WCS=CSYS1
&WCSDRW=&YES
DELETE/P1,P2,P3
idover:
HALT
作者: hmq78    时间: 2009-5-9 10:49
顶,谢谢了
作者: hmq78    时间: 2009-5-9 10:50
能不能告诉下怎么控制工程图中基本视图的大小比例啊
作者: sumojinli    时间: 2009-9-9 23:23
看贴必回贴!!!!!!
作者: tzsiyuan    时间: 2009-9-16 00:32
good. thanks
作者: lgmsddy    时间: 2009-9-18 07:42
顶起来,…………
作者: kailler    时间: 2009-10-3 17:31
不懂grip,不过看上去是沿着xyz轴求的外形尺寸,如果是这样的话,这个用open nx好像一个函数就可以了
/******************************************************************************
Returns the bounding box information of wireframe and solid type objects
aligned to a CSYS.

Wireframe objects include lines, arcs, splines, and conics.  Solid type
objects include bodies, faces, and edges.  Bounding box values are
returned in absolute coordinate values according to where the object
exists in the part file and aligned to the input CSYS.

If you call this function with an occurrence, the bounding box
of the underlying geometry is transformed into assembly space.

Use occurrence object tags when working in an assembly context and prototype
object tags when working in non-assembly situations. Passing in a prototype
object tag when in an assembly may produce undesired results.

The csys_tag should always be in the context of the current work part.

To derive the corner points, use the X,Y,X components of the
min_corner  and then add the X,Y,Z components of the directions multiplied
by the X,Y,Z distances. For Example, to derive the 2 corner points:
  corner_pts[2][3]

  corner_pts[0][0] = min_corner[0]
  corner_pts[0][1] = min_corner[1]
  corner_pts[0][2] = min_corner[2]
  for i = 0 -> 2 inclusive
    corner_pts[1][i] = min_corner[i]
    for j = 0 -> 2 inclusive
      corner_pts[1][i] += directions[j][i] * distances[j]

While a more accurate box is produced, processing time may be increased
significantly.

Environment: Internal  and  External
See Also:
History: Originally released in NX V4.0
******************************************************************************/
extern UFUNEXPORT int UF_MODL_ask_bounding_box_exact(
tag_t   object ,          /* <I>
                             Object identifier of object to ask bounding box.
                          */
tag_t   csys_tag,         /* <I>
                             CSYS to use for box alignment.
                             NULL_TAG - Use Work CSYS
                          */
double  min_corner[3],    /* <O>
                             Minimum corner of box of object.
                             [0] - minimum x value
                             [1] - minimum y value
                             [2] - minimum z value
                          */
double  directions[3][3], /* <O>: direction vectors of bounding box
                             [0][] - X Direction
                             [1][] - Y Direction
                             [2][] - Z Direction */
double  distances[3]      /* <O>
                             Distances to move along directions of CSYS
                             to derive all points of the bounding box.
                             [0] - X distance value
                             [1] - Y distance value
                             [2] - Z distance value
                          */
);
作者: procamcae    时间: 2009-10-17 09:24
谢谢楼主的分享~~
作者: 屠倚龙天    时间: 2009-11-23 22:00
谢谢楼主的分享~~
作者: begtostudy    时间: 2009-11-24 13:30
恩,是的
最小包围盒是个几何难题
目前较多的做法是采用三角网格模型来计算。

UG提供的方法只能以XOY上建立包围盒,不是真正的OBB有向包围盒

如果有人想研究,一起切磋啊,呵呵
作者: 衡平    时间: 2009-11-26 08:26
太经典了。。顶起来!!
作者: 屠倚龙天    时间: 2009-11-28 11:57
最新技术图书:

https://book.icax.org/solidworks/2009/230.html
SolidWorks工程图教程(CSWP全球专业认证考试培训教程)

https://book.icax.org/proengineer/2009/240.html
Pro/ENGINEER中文野火版4.0标准教程(新编21世纪IT职业技术培训精品课程规划教材)

https://book.icax.org/solidworks/2009/229.html
SolidWorks零件与装配体教程(CSWP全球专业认证考试培训教程)

https://book.icax.org/proengineer/2008/204.html
Pro/ENGINEER 中文野火版4.0 技术应用从业通

https://book.icax.org/nx/2009/236.html
UG NX6三维造型实例图解(CAD/CAM实例图解视频教程)(附DVD光盘一张)
UG NX6三维造型实例图解(CAD/CAM实例图解视频教程)(附DVD光盘一张)顶,谢谢了
作者: xlbh    时间: 2009-12-9 15:18
谢谢楼主的分享~~
作者: look_tfq    时间: 2009-12-9 17:50
有这么麻烦么?
作者: 吴哓    时间: 2009-12-12 13:03
顶,谢谢了
作者: danyfer    时间: 2009-12-17 21:01
好文章就要顶起来,学习了
作者: shinhwakiki    时间: 2009-12-28 23:18
谢谢!!!!!!!!!1
作者: 无雨    时间: 2010-6-10 19:20
好强啊,正在学习GRIP,好好借鉴一下
作者: landson_tom    时间: 2010-6-16 17:38
感谢LZ,正在学习中
作者: 吴哓    时间: 2010-7-25 15:48
顶,谢谢了
作者: qzhitian    时间: 2010-8-3 23:24
11#  


楼主大大的好人。
作者: qzhitian    时间: 2010-8-3 23:25
1#  
楼主大大的好人
作者: hzengchai    时间: 2010-8-12 11:10
thankssssss
作者: ACAIGG    时间: 2010-9-2 19:35
看贴必回贴!!!!!!
作者: wuma7926    时间: 2010-9-11 13:05
好东西就要顶起来。
作者: ahutxiaxue    时间: 2010-9-30 02:39
学习一下,
用api很简单,
但是要自己调整坐标系,
大家最好想一个可以自动求的最小尺寸的包容体的功能,
有人讲用遗传学几何算法可以
作者: hunter2    时间: 2010-12-4 00:12
支持源码,对于菜鸟来说,太珍贵了,谢谢!
作者: jinyong119    时间: 2011-1-5 14:49
顶顶顶顶顶顶
作者: qazqaz0    时间: 2011-1-5 15:54
谢谢楼主的分享~~
作者: cheugcam    时间: 2011-1-7 17:18
谢谢楼主的分享~~
作者: UG用户    时间: 2011-2-24 10:52
试用下,谢谢
作者: zhangcanwei    时间: 2011-2-25 07:26
这个程序的出镜率还挺高的。这是很多年前的程序了,现在看来还可以再精简些。各位就当做GRIP的入门练习程序吧
作者: SWORDINHAND    时间: 2012-2-28 07:54
顶,谢谢了
作者: zheng3816    时间: 2012-3-5 10:40
顶,谢谢了
作者: spacediffe    时间: 2012-7-24 18:55
为什么会有那么一段注释掉的东西
作者: live2490    时间: 2012-7-26 19:33
谢谢楼主的分享~~
作者: chenwei    时间: 2012-7-27 11:00
用一个api函数就搞定了
作者: aoci72681    时间: 2013-1-11 23:36
正好需要...實在是及時雨....感恩
作者: zmjacky    时间: 2013-3-27 20:44
谢谢分享,
作者: ffhi    时间: 2013-5-9 13:42
学习学习好了。
作者: pushmoldclj    时间: 2013-10-31 00:10
谢谢楼主的分享~~




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