找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 29058|回复: 40
打印 上一主题 下一主题

[原创] 精确包容体(附grip源码)

[复制链接]
跳转到指定楼层
1
发表于 2009-5-8 16:22:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这些年老是有人在说什么最大盒子、包容体的事情。这很重要吗?可能我不做塑胶模体会不到。现发上一个程序,回报网络。

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

本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 赞一下!赞一下!
2
发表于 2009-5-9 10:49:10 | 只看该作者
顶,谢谢了
3
发表于 2009-5-9 10:50:32 | 只看该作者
能不能告诉下怎么控制工程图中基本视图的大小比例啊
4
发表于 2009-9-9 23:23:26 | 只看该作者
看贴必回贴!!!!!!
5
发表于 2009-9-16 00:32:56 | 只看该作者
good. thanks
6
发表于 2009-9-18 07:42:52 | 只看该作者
顶起来,…………
7
发表于 2009-10-3 17:31:13 | 只看该作者
不懂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
                          */
);
8
发表于 2009-10-17 09:24:23 | 只看该作者
谢谢楼主的分享~~
9
发表于 2009-11-23 22:00:54 | 只看该作者
谢谢楼主的分享~~
10
发表于 2009-11-24 13:30:44 | 只看该作者
恩,是的
最小包围盒是个几何难题
目前较多的做法是采用三角网格模型来计算。

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

如果有人想研究,一起切磋啊,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-24 08:39 , Processed in 0.025621 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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