![]() |
【转帖】[求助]还是创建图层的问题
[求助]还是创建图层的问题
[求助]还是创建图层的问题 我在编写创建图层时遇到了一个匪夷所思的问题,和大家分享一下,希望能有高手帮忙解决! 另外 我初学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 已跳过 |
所有的时间均为北京时间。 现在的时间是 04:10 AM. |