![]() |
【转帖】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.. |
所有的时间均为北京时间。 现在的时间是 09:31 AM. |