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


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


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-16, 05:53 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】[求助]还是创建图层的问题

[求助]还是创建图层的问题
[求助]还是创建图层的问题
我在编写创建图层时遇到了一个匪夷所思的问题,和大家分享一下,希望能有高手帮忙解决! 另外 我初学arx 希望大家多指点!
这是我编写的创建图层的函数,放在自己添加的 ccreateent 类中
acdbobjectid ccreateent::creatlayer (char layername[100],int nnewcolor,
int weight,char linetype[50])
{
// 获得当前图形的层表
acdblayertable *playertbl;
acdbhostapplicationservices()->workingdatabase()
->getlayertable(playertbl, acdb::kforwrite);

// 创建新的层表记录
acdbobjectid layertblrcdid;
acdblayertablerecord *playertblrcd;
playertblrcd = new acdblayertablerecord();
playertblrcd->setname(layername);
accmcolor color;
color.setcolorindex(nnewcolor);
playertblrcd->setcolor(color);
acdb::lineweight lineweight =(acdb::lineweight)weight;
playertblrcd->setlineweight(lineweight);
acdblinetypetable *plinetypetbl;
acdbhostapplicationservices()->workingdatabase()
->getlinetypetable(plinetypetbl, acdb::kforwrite);
acdbobjectid linetypeid;
plinetypetbl->getat(linetype, linetypeid);
playertblrcd->setlinetypeobjectid(linetypeid);
plinetypetbl->close();

// 将新建的层表记录添加到层表中

playertbl->add(layertblrcdid, playertblrcd);
playertbl->close();
playertblrcd->close();
return layertblrcdid;
}
以下是我在acrxenrypoint 中调用的 函数:
static void shipmyrun(void)
{
// add your code for command shipmy.run here
char name1[]="中心线";
char name2[]="虚线";
char name3[]="粗实线";
char linetype1[]="center";
char linetype2[]="dashed";
char linetype3[]="continuous";
acdblayertable *playertbl;
acdbobjectid layertblrcdid;
acdbhostapplicationservices()->workingdatabase()
->getlayertable(playertbl, acdb::kforread);
if ((playertbl->getat(name1,layertblrcdid))!=acad::eok)
{
ccreateent::creatlayer(name1,1,0,linetype1);
}else{
acutprintf("\n图层以创建!");}
if ((playertbl->getat(name2,layertblrcdid))!=acad::eok)
{
ccreateent::creatlayer(name2,50,0,linetype2);
}else{
acutprintf("\n图层以创建!");}
if ((playertbl->getat(name3,layertblrcdid))!=acad::eok)
{
ccreateent::creatlayer(name3,100,30,linetype3);
}else{
acutprintf("\n图层以创建!");}
acutprintf("\n创建图层任务已完成!");
playertbl->close();
}
编译没有问题,但在cad中无法运行,导致cad致命错误。而且我试过了:
static void shipmyrun(void)
{
// add your code for command shipmy.run here
char name1[]="中心线";
char name2[]="虚线";
char name3[]="粗实线";
char linetype1[]="center";
char linetype2[]="dashed";
char linetype3[]="continuous";
//acdblayertable *playertbl;
//acdbobjectid layertblrcdid;
//acdbhostapplicationservices()->workingdatabase()
//->getlayertable(playertbl, acdb::kforread);
//if ((playertbl->getat(name1,layertblrcdid))!=acad::eok)
//{
ccreateent::creatlayer(name1,1,0,linetype1);
//}else{
//acutprintf("\n图层以创建!");}
//if ((playertbl->getat(name2,layertblrcdid))!=acad::eok)
//{
ccreateent::creatlayer(name2,50,0,linetype2);
//}else{
//acutprintf("\n图层以创建!");}
//if ((playertbl->getat(name3,layertblrcdid))!=acad::eok)
//{
ccreateent::creatlayer(name3,100,30,linetype3);
//}else{
//acutprintf("\n图层以创建!");}
//acutprintf("\n创建图层任务已完成!");
//playertbl->close();
}
注释掉 判断语句后 却可以正确执行,另外我也试过 注释掉 创建图层的函数 加一条输出字符 函数,也运行成功了, 这使我我感到匪夷所思,请哪位高手指点一下!
static void shipmyrun(void)
{
// add your code for command shipmy.run here
char name1[]="中心线";
char name2[]="虚线";
char name3[]="粗实线";
char linetype1[]="center";
char linetype2[]="dashed";
char linetype3[]="continuous";
acdblayertable *playertbl;
acdbobjectid layertblrcdid;
acdbhostapplicationservices()->workingdatabase()
->getlayertable(playertbl, acdb::kforread);
if ((playertbl->getat(name1,layertblrcdid))!=acad::eok)
{
//ccreateent::creatlayer(name1,1,0,linetype1);
acutprintf("\n图层以创建!");
}else{
acutprintf("\n图层以创建!");}
if ((playertbl->getat(name2,layertblrcdid))!=acad::eok)
{
//ccreateent::creatlayer(name2,50,0,linetype2);
acutprintf("\n图层以创建!");
}else{
acutprintf("\n图层以创建!");}
if ((playertbl->getat(name3,layertblrcdid))!=acad::eok)
{
//ccreateent::creatlayer(name3,100,30,linetype3);
acutprintf("\n图层以创建!");
}else{
acutprintf("\n图层以创建!");}
acutprintf("\n创建图层任务已完成!");
playertbl->close();
}
你在creatlayer函数中
acdbhostapplicationservices()->workingdatabase()
->getlayertable(playertbl, acdb::kforwrite);
而在你外面调用
acdbhostapplicationservices()->workingdatabase()
->getlayertable(playertbl, acdb::kforread);
当然要崩溃!
你创建之间的判断可以放到函数里面去判断
嗯 我按你说的把 判断 放在 createlayer 里面了
acdbobjectid ccreateent::creatlayer (char layername[100],int nnewcolor,
int weight,char linetype[50])
{
// 获得当前图形的层表
acdblayertable *playertbl;
acdbobjectid layertblrcdid;
acdbhostapplicationservices()->workingdatabase()
->getlayertable(playertbl, acdb::kforwrite);
if ((playertbl->getat(layername,layertblrcdid))!=acad::eok)
{

// 创建新的层表记录
acdbobjectid layertblrcdid;
acdblayertablerecord *playertblrcd;
playertblrcd = new acdblayertablerecord();
playertblrcd->setname(layername);
accmcolor color;
color.setcolorindex(nnewcolor);
playertblrcd->setcolor(color);
acdb::lineweight lineweight =(acdb::lineweight)weight;
playertblrcd->setlineweight(lineweight);
acdblinetypetable *plinetypetbl;
acdbhostapplicationservices()->workingdatabase()
->getlinetypetable(plinetypetbl, acdb::kforwrite);
acdbobjectid linetypeid;
plinetypetbl->getat(linetype, linetypeid);
playertblrcd->setlinetypeobjectid(linetypeid);
plinetypetbl->close();

// 将新建的层表记录添加到层表中

playertbl->add(layertblrcdid, playertblrcd);
playertbl->close();
playertblrcd->close();
acutprintf("\n图层创建成功!");
return layertblrcdid;
}else{
acutprintf("\n图层以创建!");}
}
但编译时 有这么个 警告 warning c4715: “ccreateent::creatlayer” : 不是所有的控件路径都返回值。
会对程序造成影响么?
嗯 这次 彻底解决了 谢谢!
acdbobjectid ccreateent::creatlayer (char layername[100],int nnewcolor,
int weight,char linetype[50])
{
// 获得当前图形的层表
acdblayertable *playertbl;
acdbobjectid layertblrcdid;
acdbhostapplicationservices()->workingdatabase()
->getlayertable(playertbl, acdb::kforwrite);
if ((playertbl->getat(layername,layertblrcdid))!=acad::eok)
{

// 创建新的层表记录
acdbobjectid layertblrcdid;
acdblayertablerecord *playertblrcd;
playertblrcd = new acdblayertablerecord();
playertblrcd->setname(layername);
accmcolor color;
color.setcolorindex(nnewcolor);
playertblrcd->setcolor(color);
acdb::lineweight lineweight =(acdb::lineweight)weight;
playertblrcd->setlineweight(lineweight);
acdblinetypetable *plinetypetbl;
acdbhostapplicationservices()->workingdatabase()
->getlinetypetable(plinetypetbl, acdb::kforwrite);
acdbobjectid linetypeid;
plinetypetbl->getat(linetype, linetypeid);
playertblrcd->setlinetypeobjectid(linetypeid);
plinetypetbl->close();

// 将新建的层表记录添加到层表中

playertbl->add(layertblrcdid, playertblrcd);
playertbl->close();
playertblrcd->close();
acutprintf("\n [%s层] 创建成功!",layername);
return layertblrcdid;
}else{
acdbobjectid layertblrcdid;
playertbl->getat(layername,layertblrcdid);
return layertblrcdid;
acutprintf("\n [%s层] 以创建!",layername);
}
}
生成:1 已成功, 0 已失败, 0 已跳过
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


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

高级搜索
显示模式

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

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



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


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