几何尺寸与公差论坛------致力于产品几何量公差标准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-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自动化论坛(仅游客可见)
回复


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

高级搜索
显示模式

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

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

相似的主题
主题 主题发起者 论坛 回复 最后发表
【转帖】how do i get to draw shapes yang686526 DirectDWG 0 2009-05-05 12:28 PM
【转帖】在vba中求点的ucs坐标,嘿嘿,在工程中用处可大了 - 精华帖集合 yang686526 ObjectARX(VB.NET/C#) 0 2009-04-29 05:26 PM
[原创]ucs下如何创建物体的包围框 yang686526 ObjectARX(AutoLISP) 0 2009-04-25 10:02 PM
【转帖】add-in how to show in menu, but dont show icon yang686526 SolidWorks二次开发 0 2009-04-13 08:43 AM
Unicode、UCS、UTF、BMP、BOM huangyhg vc编程 2 2007-01-22 05:43 PM


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


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