iCAx开思工具箱

标题: CAM开发,如何区分内外边界 [打印本页]

作者: zhangcanwei    时间: 2009-3-31 17:49
标题: CAM开发,如何区分内外边界
现有很多封闭曲线,框选它们,使用固定轴操作,要创建驱动边界。问题是如何来区分哪些是外边界,那些是内边界?
作者: zhangcanwei    时间: 2010-10-6 07:31
这个帖子又是一年多了,现在顶上来?不知有无好办法?
作者: look_tfq    时间: 2010-10-6 07:37
判断范围大小,前提是知道它们要正确分组
作者: cam-yp    时间: 2010-10-6 21:17
2种思路参考:
1.计算边界面积,最大都就是最外面的
2.利用这些边界创建边界平面,利用函数自动添加这个边界平面
作者: zhangcanwei    时间: 2010-10-7 07:11
cam-yp 发表于 2010-10-6 21:17
2种思路参考:
1.计算边界面积,最大都就是最外面的
2.利用这些边界创建边界平面,利用函数自动添加这个边界平面


创建边界平面时,能够区分内外边界吗?
作者: zjs    时间: 2010-10-7 09:34
想法:
        1. 首先将选择的线按封闭分类,称为集合1,集合2,集合3,集合4
        2. 假设现在求集合1,集合2关系。
            集合2 内任意一点,与集合1内的任意一点为起点组起基准向量
           同理,将集合2内的这一点,与集合1内的下一点组成新向量。
         3.1  分别求基准向量与新向量的夹角,如果存在角度大于180, 说明集合2 在集合1 的内面。
                同理如果不存大于180夹角---集合2 在集合1 的外部。
        3.2  也可以根据向量夹角的变化来判定。 如夹角是增加的方式,说明 集合2 在集合1 的内部
               如夹角是有时增加,有时减少说明集合2 在集合1 的外面。
        
前题条件,集合点是从线集合中,按顺序提取的。

我想这样应该可以确定内外边界了。
作者: cam-yp    时间: 2010-10-7 14:17
zhangcanwei 发表于 2010-10-7 07:11


创建边界平面时,能够区分内外边界吗?
Example
The following code creates a bounded plane with three interior hole loops. Thus, there are a total of four curve string loops. The figure that follows illustrates the results of the example C program.





Figure Bounded Plane Feature


#include
#include
#include
#include
#include
#include
#include

#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))

static int report( char *file, int line, char *call, int irc)
{
if (irc)
{
char messg[133];
printf("%s, line %d: %s\n", file, line, call);
(UF_get_fail_message(irc, messg)) ?
printf(" returned a %d\n", irc) :
printf(" returned error %d: %s\n", irc, messg);
}
return(irc);
}

static void do_ugopen_api(void)
{
/* bounded plane edge tolerance */
double tol[3];
/* data points for objects in loops */
static double points[45] = { 4.,-2.,0.,4.,4.,0.,-4.,4.,0.,-4.,
-4.,0.,0.,-2.,0.,-2.,3.,0.,-3.,3.,0.,-3.,2.,0.,
-2.,2.,0.,-2.,-1.,0.,2.,3.,0.,3.,3.,0.,3.,2.,0.,
2.,2.,0.,2.,3.,0.};
static double startang = 0.0;
static double endang = 6.28318530717958648;
static double arcrad = 1.0;
char prtnam[133];
int loops[4];
int numlps = 4;
int units =2;
int arc = 1;
int k, total;
tag_t bpobj;
tag_t part;
tag_t objarray1[4];
tag_t objarray2[3];
tag_t objarray3, wcs_tag;
tag_t objarray4[4];
UF_STRING_t generator;
UF_STRING_p_t ge = &generator;

UF_CURVE_line_t line1;
UF_CURVE_line_t line2;
UF_CURVE_line_t line3;
UF_CURVE_line_t line4;
UF_CURVE_line_t line5;
UF_CURVE_line_t line6;
UF_CURVE_line_t line7;
UF_CURVE_line_t line8;
UF_CURVE_line_t line9;
UF_CURVE_arc_t arc1;


line1.start_point[0] = points[3];
line1.start_point[1] = points[4];
line1.start_point[2] = points[5];
line1.end_point[0] = points[0];
line1.end_point[1] = points[1];
line1.end_point[2] = points[2];

line2.start_point[0] = points[6];
line2.start_point[1] = points[7];
line2.start_point[2] = points[8];
line2.end_point[0] = points[3];
line2.end_point[1] = points[4];
line2.end_point[2] = points[5];

line3.start_point[0] = points[9];
line3.start_point[1] = points[10];
line3.start_point[2] = points[11];
line3.end_point[0] = points[6];
line3.end_point[1] = points[7];
line3.end_point[2] = points[8];

line4.start_point[0] = points[15];
line4.start_point[1] = points[16];
line4.start_point[2] = points[17];
line4.end_point[0] = points[18];
line4.end_point[1] = points[19];
line4.end_point[2] = points[20];

line5.start_point[0] = points[18];
line5.start_point[1] = points[19];
line5.start_point[2] = points[20];
line5.end_point[0] = points[21];
line5.end_point[1] = points[22];
line5.end_point[2] = points[23];

line6.start_point[0] = points[30];
line6.start_point[1] = points[31];
line6.start_point[2] = points[32];
line6.end_point[0] = points[33];
line6.end_point[1] = points[34];
line6.end_point[2] = points[35];

line7.start_point[0] = points[33];
line7.start_point[1] = points[34];
line7.start_point[2] = points[35];
line7.end_point[0] = points[36];
line7.end_point[1] = points[37];
line7.end_point[2] = points[38];

line8.start_point[0] = points[36];
line8.start_point[1] = points[37];
line8.start_point[2] = points[38];
line8.end_point[0] = points[39];
line8.end_point[1] = points[40];
line8.end_point[2] = points[41];

line9.start_point[0] = points[39];
line9.start_point[1] = points[40];
line9.start_point[2] = points[41];
line9.end_point[0] = points[42];
line9.end_point[1] = points[43];
line9.end_point[2] = points[44];

arc1.start_angle = startang;
arc1.end_angle = endang;
arc1.arc_center[0] = points[27];
arc1.arc_center[1] = points[28];
arc1.arc_center[2] = points[29];
arc1.radius = arcrad;

strcpy(prtnam,"bplane");

UF_CALL(UF_PART_new(prtnam,units,&part));
UF_CALL(UF_CSYS_ask_wcs(&wcs_tag));
UF_CALL(UF_CSYS_ask_matrix_of_object(wcs_tag, &arc1.matrix_tag));

/* Create geometry for a bounded plane */
/* 1 peripheral loop and 3 hole loops */
/* Set up loop 1 - peripheral boundary - 3 lines and an arc */
loops[0] = 4;
UF_CALL(UF_CURVE_create_line(&line1, &objarray1[0]));
UF_CALL(UF_CURVE_create_line(&line2, &objarray1[1]));
UF_CALL(UF_CURVE_create_line(&line3, &objarray1[2]));
FTN(uf5063)(&arc, points, &points[12], &points[9],
&objarray1[3]);

/* Set up loop 2 - hole - 2 lines and an arc */
loops[1] = 3;
UF_CALL(UF_CURVE_create_line(&line4, &objarray2[0]));
UF_CALL(UF_CURVE_create_line(&line5, &objarray2[1]));
FTN(uf5063)(&arc, &points[21], &points[24], &points[15],
&objarray2[2]);

/* Set up loop 3 - hole - single arc */
loops[2] = 1;
UF_CALL(UF_CURVE_create_arc(&arc1, &objarray3));

/* Set up loop 4 - hole - 4 lines */
loops[3] = 4;
UF_CALL(UF_CURVE_create_line(&line6, &objarray4[0]));
UF_CALL(UF_CURVE_create_line(&line7, &objarray4[1]));
UF_CALL(UF_CURVE_create_line(&line8, &objarray4[2]));
UF_CALL(UF_CURVE_create_line(&line9, &objarray4[3]));
UF_MODL_init_string_list(ge);
UF_MODL_create_string_list(numlps,12,ge);

/* Store section loop data into string list structure. */
total = 0;
ge->string[0] = loops[0];
ge->dir[0] = 1;
for (k = 0; k < loops[0]; k++) ge->id[total++] = objarray1[k];
ge->string[1] = loops[1];
ge->dir[1] = -1;
for (k = 0; k < loops[1]; k++) ge->id[total++] = objarray2[k];
ge->string[2] = loops[2];
ge->dir[2] = 1;
ge->id[total++] = objarray3;
ge->string[3] = loops[3];
ge->dir[3] = -1;
for (k = 0; k < loops[3]; k++) ge->id[total++] = objarray4[k];
if (total != 12) printf("Error in total value!\n");
tol[0] = .001;
tol[1] = .5 * (PI/180);
tol[2] = .02;

/* Create a bounded plane */
UF_CALL(UF_MODL_create_bplane(ge,tol,&bpobj));
UF_MODL_free_string_list(ge);

}

/*ARGSUSED*/
void ufusr(char *param, int *retcode, int paramLen)
{
if (!UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}

int ufusr_ask_unload(void)
{
return (UF_UNLOAD_IMMEDIATELY);
}

作者: zhangcanwei    时间: 2010-10-8 07:29
等我试试再做结论。。。
作者: bluecloak    时间: 2010-11-2 22:55
1 对于这个问题,我觉的应该从产生这些曲线的过程中分析。在生成这些曲线的同时,给这些曲线赋予属性,这就要求必须在曲线的数据里加入一定格式,区分外还是内,这在ug里可以实现,但是如果转入AutoCAD里就不行了。
2要明确单纯从曲线的本身判断,是相当复杂的,如果达到10的4次方级别的数量级,需要大量的运算,不论你用什么快捷的算法,还是策略,因为曲线原本不具有这样的属性。
作者: zhangcanwei    时间: 2010-11-3 07:29
bluecloak 发表于 2010-11-2 22:55
1 对于这个问题,我觉的应该从产生这些曲线的过程中分析。在生成这些曲线的同时,给这些曲线赋予属性,这就要求必须在曲线的数据里加入一定格式,区分外还是内,这在ug里可以实现,但是如果转入AutoCAD里就不行了。
...

在UG中如何实现呢?
比如现在有一个大的封闭曲线,里面包含几个小的封闭曲线。用这些封闭曲线进行拉伸操作,能够生成一个带有孔的实体。这说明拉伸命令里已经有区分内外边界的能力。
有这个能力的命令还有很多,问题是如何从这些命令里获取内外边界信息呢?
作者: zhangcanwei    时间: 2010-11-3 10:03
把这些内外边界信息提取出来后,记录在曲线的属性中,以后就方便了
作者: yangocean    时间: 2010-11-21 00:55
在ACIS里面是通过这些曲线的走向来判断的,比如,逆时针是外边界,顺时针是内边界。
UG不了解。。。
作者: tzvtcwwb    时间: 2010-11-25 15:50
唉! 很少人做CAM的二次开发,
作者: zhangcanwei    时间: 2011-4-9 20:06
顶上去。两年多了。。。。
作者: zhangcanwei    时间: 2011-4-13 12:38
二次开发不只是NX内部命令的简单堆砌,我们不需拿出自己的想法(算法)
作者: lgmsddy    时间: 2011-4-17 07:35
张工,这个问题很难啊
作者: zale_lzj    时间: 2011-4-22 22:35
我也来奏个热闹

可以先框选所有曲线拉伸出一个实体
再查询该实体底面的外环边缘(即外边界)
作者: zhangcanwei    时间: 2011-4-23 07:18
楼上这个思路应该是可以的,根据实体可以把边界分类,原先是无序的。现在知道了内外边界的配对关系。可惜依然无法判断具有配对关系边界的内外属性。然后还需要把这些配对边界,分别单独创建平面片体,判断片体的面积,面积最大的就是外边界,剩余的就是内边界。

  只是这样做是很浪费时间的,究竟有多费时间,我也没做过。在这里是想寻求一个更好的办法。


   还有一点,拉伸实体时,可以把拉伸高度设置为0,这样得到的就是平面片体,可以直接获取边界,否则还需过滤掉三维实体上的无用边界。


作者: zhaojianhong    时间: 2011-4-23 22:55
我给你说下吧,肯定没问题,将选择的边界创建成BOUDY类型,因为API里面没此函数,通过GRIP里面转化就可以了。。。。
作者: zhangcanwei    时间: 2011-4-24 13:03
将边界转换成boungary类型,好象也不能区分内外边界吧? NX中在选择边界时,已经有几个选项了,如图所示。其中的“面”,就是通过提取片体轮廓来定义边界的,可惜,所有的边界要么都定义成外边界,要么都定义成内边界。

用grip来提取,我没试过,能区分内外吗?
作者: LIUCHANGLIN    时间: 2011-4-25 13:30
你这问题时间还真长!何不试试UF_MODL_ask_loop_list_item呢,可区分内外边界
作者: zhangcanwei    时间: 2011-4-28 17:54
我看了说明,这个函数好像不能判断内外。楼上能详细说明吗?
作者: LIUCHANGLIN    时间: 2011-4-29 16:27
还没解决????????
作者: zhangcanwei    时间: 2011-4-30 15:55
没有解决,您能给个提醒吗?




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