创建自己的曲线打断命令 - 精华帖集合
www.dimcax.com
创建自己的曲线打断命令
void drawentity(acdbentity* pentity);
bool breakcurve(acdbcurve* curve, acgepoint3d pt);
bool breakcurve(acdbcurve* curve, acgepoint3d p1, acgepoint3d p2);
static void mybreak2008_mybreak(void)
{
// add your code for command mybreak2008._mybreak here
ads_point pt1,pt2;
ads_name entname;
acad::errorstatus es;
int ret;
achar kword[100];
if (acedentsel(_t("\n选择所要打断的曲线:"), entname, pt1) !=rtnorm)
{
return;
}
acdbobjectid entid;
acdbcurve *pcurve=null;
acdbentity *pent = null;
es = acdbgetobjectid(entid, entname);
if (es != acad::eok)
{
return;
}
acdbopenobject(pent, entid, acdb::kforwrite);
if (pent->iskindof(acdbcurve::desc()))
{
pcurve = acdbcurve::cast(pent);
if (pcurve != null)
{
acedinitget (null, _t("f"));
ret=acedgetpoint(null,_t("\n指定第二个打断点或[第一点(f)]:"),pt2);
switch (ret)
{
case rtkword:
ret=acedgetinput(kword);
if ( ret!= rtnorm )
break ;
acedinitget(rsg_nonull, _t(""));
ret=acedgetpoint(null,_t("\n指定第一个打断点:"),pt1);
if (ret!=rtnorm)
break;
acedinitget(rsg_nonull, _t(""));
ret=acedgetpoint(null,_t("\n指定第二个打断点:"),pt2);
if (ret!=rtnorm)
break;
breakcurve(pcurve,aspnt3d(pt1), aspnt3d(pt2));
break;
case rtnone:
breakcurve(pcurve,aspnt3d(pt1));
break;
case rtnorm:
breakcurve(pcurve,aspnt3d(pt1), aspnt3d(pt2));
break;
default:
break;
}
}
}
pent->close();
}
//以下为函数
//打断于点
bool breakcurve(acdbcurve* curve,acgepoint3d pt)
{
acgepoint3d p1;
curve->getclosestpointto(pt,p1);
double param;
curve->getparamatpoint(p1,param);
acgedoublearray params;
params.append(param);
acdbvoidptrarray curvesegments;
curve->getsplitcurves(params, curvesegments);
acdbentity* ent =null;
if (curvesegments.length()==2)
{
ent=(acdbentity*)curvesegments[0];
drawentity(ent);
ent->close();
ent=(acdbentity*)curvesegments[1];
drawentity(ent);
ent->close();
curve->erase();
}
else
{
curve->close();
}
return true ;
}
//两点打断
bool breakcurve(acdbcurve* curve, acgepoint3d p1, acgepoint3d p2)
{
acgepoint3d p11;
curve->getclosestpointto(p1,p11);
double param1;
curve->getparamatpoint(p11,param1);
acgepoint3d p21;
curve->getclosestpointto(p2,p21);
double param2;
curve->getparamatpoint(p21,param2);
acgedoublearray params;
if (param1<param2)
{
params.append(param1);
params.append(param2);
}
else
{
params.append(param2);
params.append(param1);
}
acdbvoidptrarray curvesegments;
curve->getsplitcurves(params, curvesegments);
acdbentity* ent =null;
if (curvesegments.length()==2)
{
ent=(acdbentity*)curvesegments[1];
drawentity(ent);
ent->close();
}
else if (curvesegments.length()==3)
{
ent=(acdbentity*)curvesegments[0];
drawentity(ent);
ent->close();
ent=(acdbentity*)curvesegments[2];
drawentity(ent);
ent->close();
}
curve->erase();
return true ;
}
//绘制打断的曲线
void drawentity(acdbentity* pentity)
{
acdbblocktable *pblocktable;
acdbhostapplicationservices()->workingdatabase()
->getsymboltable(pblocktable, acdb::kforread);
acdbblocktablerecord *brec;
resbuf tilemode;
acedgetvar(_t("tilemode"),&tilemode);
int tile=tilemode.resval.rint;
if (tile)
pblocktable->getat(acdb_model_space, brec,acdb::kforwrite);
else
pblocktable->getat(acdb_paper_space, brec,acdb::kforwrite);
pblocktable->close();
acdbobjectid entid;
brec->appendacdbentity(entid, pentity);
brec->close();
}
复制代码
此段代码部分取材明经上的叶开,在此致谢。
这个命令与break唯一不同的是如果默认是打断于点 你稍微改造一下便可设置成自己方便的打断方式,譬如选择集打断
[ ]
程序很好!
因為專業, 所以精彩 !!!
好代码!!!!!!!!!!!
非常好啊!
啊
好程序,支持!