几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » DirectDWG
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


 
 
主题工具 搜索本主题 显示模式
旧 2009-05-07, 06:15 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】vecotrizing 3d Solids Part 2

vecotrizing 3d solids part 2
vecotrizing 3d solids part 2
hello all,
is there any reason why this post below was not answered, is it extremely simple that i am missing something (which is probably very likely :-) ) ?
and once again thanx in advance whoever helps me.
cheers
jason
===================================
i am trying to vectorize a 3dsolid, but i never get shell information/face/mesh, however all 2d line/polyline vectorization is correct.
i notice that the m_rendermode is optimized 2d, but even if i change this, it still only produces outlines. my code is a follows :
header ------------
class vectorizer : public odgigeometrysimplifier, public odgsbasevectorizeview {
public:
vectorizer() {
//setfilltype(kodgifillalways);
odgigeometrysimplifier::m_rendermode = kgouraudshadedwithwireframe;
odgsbasevectorizeview::m_rendermode = kgouraudshadedwithwireframe;
};
virtual void polylineout(odint32 n, const odgepoint3d* pts);
virtual void polygonout(odint32 nbpoints, const odgepoint3d *pvertexlist, const odgevector3d *pnormal = 0);
virtual void meshproc(odint32 rows,
odint32 columns,
const odgepoint3d* vertexlist,
const odgiedgedata* pedgedata = 0,
const odgifacedata* pfacedata = 0,
const odgivertexdata* pvertexdata = 0) {
{..}
};
virtual void triangleout(const odint32* vertices,
const odgevector3d* pnormal) {
{..}
}
virtual void facetout(const odint32* facelist,
const odint32* edgeindices,
const odgevector3d* pnormal) {
{..}
};
void setgmtryent(csmplptr apgmtry) { m_apgmtry = apgmtry;};
void setldr(copendwgptr apldr) { m_apldr = apldr;};
private:
bool m_btris;
csmplptr m_apgmtry;
copendwgptr m_apldr;
};
end of header ----------------
using it as follows :
oddb3dsolidptr od3dsolidptr = odentptr;
odstaticrxobject<vectorizer> dv;
dv.setgmtryent(ap3dsolid);
dv.setldr(this);
odstaticrxobject<odgicontextfordbdatabase> gicontext;
gicontext.setdatabase(od3dsolidptr->database());
dv.setdrawcontext(&dv);
dv.setcontext(&gicontext);
dv.output().setdestgeometry(dv);
dv.beginviewvectorization();
dv.draw(od3dsolidptr);
dv.endviewvectorization();
-------------------------------------------
thanx in advance for your help
cheers
jason
=============================================
hi jason,
try this:
vectorizer() {
//setfilltype(kodgifillalways);
odgigeometrysimplifier::m_rendermode = kgouraudshadedwithwireframe;
//odgsbasevectorizeview::m_rendermode = kgouraudshadedwithwireframe;
odgsbasevectorizeview::setmode(kgouraudshadedwithw ireframe);
};
last edited by dmitry a. novikov; 19th july 2006 at 01:45 amfff">.
dmitry,
thanx and that works great, however i have one last little question, and i will continue looking at the headers to try and work it out, but the triangleout pnormal parameter is always null, how do i get it to calculate the nice smooth normals i would required to have a great looking model, currently i just manually calculate each triangles normal, but it is not as smooth looking as it should be.
cheers and thanx again for your help
jason
quote:
originally posted by dmitry a. novikov
hi jason,
try this:
vectorizer() {
//setfilltype(kodgifillalways);
odgigeometrysimplifier::m_rendermode = kgouraudshadedwithwireframe;
//odgsbasevectorizeview::m_rendermode = kgouraudshadedwithwireframe;
odgsbasevectorizeview::setmode(kgouraudshadedwithw ireframe);
};
jason,
vertices' normals you are intersted in are stored in odgigeometrysimplifier
and accesible via odgigeometrysimplifier::vertexdata()->normals()fff">:
code:
void odgsopenglvectorizeview::triangleout( const odint32* indices, const odgevector3d* pnormal )
{
// normals are unnecessary
// vertex colors are in array
// face colors are set up by ontraitsmodified()
if((rendermode() <= odgsview::khiddenline) || m_bprocessingttf)
{
::glarrayelement(*indices++);
::glarrayelement(*indices++);
::glarrayelement(*indices++);
}
else // normals are necessary
{
if(m_bisvertsnormals)
{
odgiorientationtype orientation = vertexdata()->orientationflag();
for(int i = 0; i < 3; i ++)
{
if(orientation == kodgicounterclockwise)
{
::glnormal3dv((const gldouble*)(vertexdata()->normals()fff"> + indices[i]));
}
else if(orientation == kodgiclockwise)
{
odgevector3d normal = -vertexdata()->normals()[indices[i]];
::glnormal3dv((const gldouble*)&normal);
}
else // no orientation -- we must calculate it
{
odgevector3d normal = vertexdata()->normals()[indices[i]];
if(normal.dotproduct(*pnormal) < 0.0)
normal *= -1.0;
::glnormal3dv((const gldouble*)&normal);
}
::glarrayelement(indices[i]);
}
}
else
{
::glnormal3dv((const gldouble*)pnormal);
::glarrayelement(*indices++);
::glarrayelement(*indices++);
::glarrayelement(*indices++);
}
}
}
last edited by dmitry a. novikov; 20th july 2006 at 03:56 amfff">.
excellent, all seems pretty good, i should be ok from here,
and thanks again for your great help.
cheers
jason
quote:
originally posted by dmitry a. novikov
jason,
vertices' normals you are intersted in are stored in odgigeometrysimplifier
and accesible via odgigeometrysimplifier::vertexdata()->normals()fff">:
code:
void odgsopenglvectorizeview::triangleout( const odint32* indices, const odgevector3d* pnormal )
{
// normals are unnecessary
// vertex colors are in array
// face colors are set up by ontraitsmodified()
if((rendermode() <= odgsview::khiddenline) || m_bprocessingttf)
{
::glarrayelement(*indices++);
::glarrayelement(*indices++);
::glarrayelement(*indices++);
}
else // normals are necessary
{
if(m_bisvertsnormals)
{
odgiorientationtype orientation = vertexdata()->orientationflag();
for(int i = 0; i < 3; i ++)
{
if(orientation == kodgicounterclockwise)
{
::glnormal3dv((const gldouble*)(vertexdata()->normals()fff"> + indices[i]));
}
else if(orientation == kodgiclockwise)
{
odgevector3d normal = -vertexdata()->normals()[indices[i]];
::glnormal3dv((const gldouble*)&normal);
}
else // no orientation -- we must calculate it
{
odgevector3d normal = vertexdata()->normals()[indices[i]];
if(normal.dotproduct(*pnormal) < 0.0)
normal *= -1.0;
::glnormal3dv((const gldouble*)&normal);
}
::glarrayelement(indices[i]);
}
}
else
{
::glnormal3dv((const gldouble*)pnormal);
::glarrayelement(*indices++);
::glarrayelement(*indices++);
::glarrayelement(*indices++);
}
}
}
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
 


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭

相似的主题
主题 主题发起者 论坛 回复 最后发表
【转帖】asme - where to star yang686526 American standards 0 2009-04-29 07:28 PM
【转帖】cad part numbering across parts and assemblies yang686526 American standards 0 2009-04-29 06:43 PM
【转帖】please help me1i cant run i yang686526 SolidWorks二次开发 0 2009-04-13 01:30 PM
【转帖】creating a reference poin on a surface yang686526 SolidWorks二次开发 0 2009-04-12 08:36 PM
3d图形名词术语大放送 huangyhg 图形算法 1 2007-10-15 06:30 PM


所有的时间均为北京时间。 现在的时间是 03:07 PM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多