高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】[求助]还是创建图层的问题
[求助]还是创建图层的问题
[求助]还是创建图层的问题
我在编写创建图层时遇到了一个匪夷所思的问题,和大家分享一下,希望能有高手帮忙解决! 另外 我初学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 已跳过
|