查看单个帖子
旧 2009-05-06, 06:30 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】newbie how to draw a ucs icon

newbie: how to draw a ucs icon
newbie: how to draw a ucs icon
hi,
i am very new to 3d and dwgdirect, i had created a viewer, now i want to show a ucs icon on the view, plz help me, how can i use several ucs function in oddbviewport class.
manpreet
code:
#include "gi/gidrawableimpl.h"
class ucsicon1 : public odgidrawableimpl<abstractucsicon>
{
ucsicon1& operator = (const ucsicon1&);
public:
ucsicon1() {}
bool worlddraw(odgiworlddraw* ) const { return false; }
void viewportdraw(odgiviewportdraw* pvd) const
{
oddbobjectptr pvpobj = oddbobjectid(pvd->viewportobjectid()).openobject();
oddbabstractviewportdataptr pdbviewport = oddbabstractviewportdata::cast(pvpobj);
if(pdbviewport.isnull())
return;
if(!pdbviewport->isucsiconvisible(pvpobj))
return;
pvd->subentitytraits().setlinetype(0);
odgematrix3d xform;
odgiviewportgeometry& geometry = pvd->geometry();
odgiviewport& viewport = pvd->viewport();
odgepoint2d ll, ur;
odgepoint3d org;
odgevector3d xaxis, yaxis, zaxis;
bool bucsiconatorigin = pdbviewport->isucsiconatorigin(pvpobj);
pdbviewport->getucs(pvpobj, org, xaxis, yaxis);
zaxis = xaxis.crossproduct(yaxis);
odgematrix3d ucsnscaling;
ucsnscaling.setcoordsystem(odgepoint3d::korigin, xaxis, yaxis, zaxis);
viewport.getviewportdccorners(ll, ur);
double minside = odmin(ur.x - ll.x, ur.y - ll.y);
double scale = minside * 0.2 / 14.;
ucsnscaling *= odgematrix3d::scaling(scale);
odgevector3d vec;
odgematrix3d eye2world = viewport.geteyetoworldtransform();
if(bucsiconatorigin)
{
vec = org.asvector();
}
else
{
vec.set(minside * 0.0625, minside * 0.0625, 0.0);
vec.transformby(eye2world);
}
odgeextents3d iconext(odgepoint3d(-3.0,-3.0,0.0), odgepoint3d(11.0,11.0,0.0));
odgematrix3d world2eye = viewport.getworldtoeyetransform();
xform = odgematrix3d::translation(vec) * ucsnscaling;
iconext.transformby(world2eye * xform);
if(iconext.minpoint().x < ll.x || iconext.minpoint().y < ll.y ||
iconext.maxpoint().x > ur.x || iconext.maxpoint().y > ur.y)
{
vec.set(ll.x - iconext.minpoint().x + minside * (0.0625 / 4.0),
ll.y - iconext.minpoint().y + minside * (0.0625 / 4.0),
- iconext.minpoint().z);
vec.transformby(eye2world);
xform.premultby(odgematrix3d::translation(vec));
bucsiconatorigin = false;
}
geometry.pushmodeltransform(geometry.getworldtomodeltransform() * xform);
odgepoint3darray points(7);
points.resize(0);
points.append()->set(-2.0, -2.0, 0.0);
points.append()->set(-2.0, 8.0, 0.0);
points.append()->set(-3.0, 8.0, 0.0);
points.append()->set( 0.0, 11.0, 0.0);
points.append()->set( 3.0, 8.0, 0.0);
points.append()->set( 2.0, 8.0, 0.0);
points.append()->set( 2.0, -2.0, 0.0);
geometry.polyline(points.size(), points.getptr());
points.resize(0);
points.append()->set(-2.0, -2.0, 0.0);
points.append()->set( 8.0, -2.0, 0.0);
points.append()->set( 8.0, -3.0, 0.0);
points.append()->set(11.0, 0.0, 0.0);
points.append()->set( 8.0, 3.0, 0.0);
points.append()->set( 8.0, 2.0, 0.0);
points.append()->set(-2.0, 2.0, 0.0);
geometry.polyline(points.size(), points.getptr());
points.resize(0);
points.append()->set(-1.0, 9.0, 0.0);
points.append()->set( 0.0, 8.0, 0.0);
points.append()->set( 1.0, 9.0, 0.0);
geometry.polyline(points.size(), points.getptr());
points.resize(0);
points.append()->set( 0.0, 8.0, 0.0);
points.append()->set( 0.0, 7.0, 0.0);
geometry.polyline(points.size(), points.getptr());
points.resize(0);
points.append()->set( 7.0, 1.0, 0.0);
points.append()->set( 9.0, -1.0, 0.0);
geometry.polyline(points.size(), points.getptr());
points.resize(0);
points.append()->set( 7.0, -1.0, 0.0);
points.append()->set( 9.0, 1.0, 0.0);
geometry.polyline(points.size(), points.getptr());
points.resize(0);
points.append()->set(-1.0, 5.0, 0.0);
points.append()->set(-1.0, 3.0, 0.0);
points.append()->set( 0.0, 4.0, 0.0);
points.append()->set( 1.0, 3.0, 0.0);
points.append()->set( 1.0, 5.0, 0.0);
geometry.polyline(points.size(), points.getptr());
if(bucsiconatorigin)
{
points.resize(0);
points.append()->set(-1.0, 0.0, 0.0);
points.append()->set( 1.0, 0.0, 0.0);
geometry.polyline(points.size(), points.getptr());
points.resize(0);
points.append()->set( 0.0, -1.0, 0.0);
points.append()->set( 0.0, 1.0, 0.0);
geometry.polyline(points.size(), points.getptr());
}
geometry.popmodeltransform();
}
};
pview->add(odrxobjectimpl<ucsicon1>::createobject(), 0); // add icon to odgsview
first of all, thanks a lot for your support, u hav been realy kind, and i am sorry that i respond so late because of the weekend.
i am getting this error and confusion would you please tell me,
.....abstractucsicon.
what i had done is just create a empty class to compile it, do i hav to do anything else.
i am getting this error
d:\tryopendwg\tryopendwgview.cpp(228) : error c2664: 'add' : cannot convert parameter 1 from 'class odsmartptr<class ucsicon1>' to 'class odgidrawable *'
no user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
on this statement
pview->add(odrxobjectimpl<ucsicon1>::createobject(), 0);
hi,
i wonder which compiler do you use?
anyway, try
pview->add(odrxobjectimpl<ucsicon1>::createobject().get()fff">, 0);
class abstractucsicon is looking like that:
code:
class abstractucsicon : public odrxobjectimpl<odgidrawable>
{
abstractucsicon& operator = (abstractucsicon&);
public:
abstractucsicon() {}
oduint32 setattributes(odgidrawabletraits* ptraits) const
{
odgisubentitytraitsptr(ptraits)->setcolor(7);
return 0;
}
void viewportdraw(odgiviewportdraw* ) const {}
bool ispersistent() const { return false; }
};
but you may directly use odrxobjectimpl<odgidrawable> instead.
thanks,
yes ucs icon is now displaying fine, but as we rotate the drawing on y axis or x axis we donot see the z axis of the ucs icon it just displays the arrows parrallel to x and y axis but not the z axis. is there anything else i needed to do.
well, perhaps it is just not drawn?
i look at the drawing code in the second post, and see no geometry with z coordinate..
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)