找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

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

[求助] CAM开发,如何区分内外边界

[复制链接]
跳转到指定楼层
1
发表于 2009-3-31 17:49:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

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

x
现有很多封闭曲线,框选它们,使用固定轴操作,要创建驱动边界。问题是如何来区分哪些是外边界,那些是内边界?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2010-10-6 07:31:30 | 只看该作者
这个帖子又是一年多了,现在顶上来?不知有无好办法?
3
发表于 2010-10-6 07:37:17 | 只看该作者
判断范围大小,前提是知道它们要正确分组
4
发表于 2010-10-6 21:17:00 | 只看该作者
2种思路参考:
1.计算边界面积,最大都就是最外面的
2.利用这些边界创建边界平面,利用函数自动添加这个边界平面
5
发表于 2010-10-7 07:11:00 | 只看该作者
cam-yp 发表于 2010-10-6 21:17
2种思路参考:
1.计算边界面积,最大都就是最外面的
2.利用这些边界创建边界平面,利用函数自动添加这个边界平面


创建边界平面时,能够区分内外边界吗?
6
发表于 2010-10-7 09:34:19 | 只看该作者
想法:
        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 的外面。
        
前题条件,集合点是从线集合中,按顺序提取的。

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

在UG中如何实现呢?
比如现在有一个大的封闭曲线,里面包含几个小的封闭曲线。用这些封闭曲线进行拉伸操作,能够生成一个带有孔的实体。这说明拉伸命令里已经有区分内外边界的能力。
有这个能力的命令还有很多,问题是如何从这些命令里获取内外边界信息呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2025-1-31 07:42 , Processed in 0.028030 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2025 www.iCAx.org

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