我的否决样本
似乎可以工作.h
#pragma once
class DrawableOverrule : public AcGiDrawableOverrule
{
public:
DrawableOverrule(void);
virtual ~DrawableOverrule(void);
virtual Adesk::Boolean worldDraw(AcGiDrawable* pSubject, AcGiWorldDraw * wd);
virtual Adesk::UInt32 setAttributes (AcGiDrawable* pSubject, AcGiDrawableTraits * traits);
virtual bool isApplicable(const AcRxObject* pOverruledSubject) const;
};
.cpp
#include "StdAfx.h"
#include "DrawableOverrule.h"
DrawableOverrule::DrawableOverrule(void)
{
}
DrawableOverrule::~DrawableOverrule(void)
{
}
Adesk::Boolean DrawableOverrule::worldDraw(AcGiDrawable* pSubject, AcGiWorldDraw * wd )
{
if(pSubject == NULL) {return Adesk::kFalse; }
if(wd == NULL) { return Adesk::kFalse; }
if(pSubject->isKindOf(AcDbPolyline::desc()))
{
AcDbPolyline *pLine = AcDbPolyline::cast(pSubject);
if(pLine == NULL) { return Adesk::kFalse; }
if(!__super::worldDraw(pLine,wd)) { return Adesk::kFalse; }
AcCmEntityColor oldc = wd->subEntityTraits().trueColor();
AcCmEntityColor color;
if(color.setColorIndex(1) != eOk) { return Adesk::kFalse; }
wd->subEntityTraits().setTrueColor(color);
wd->subEntityTraits().setLineWeight(AcDb::kLnWt000);
AcDbVoidPtrArray ents;
if(pLine->getOffsetCurves(2.0,ents) != eOk) { return Adesk::kFalse; }
if(pLine->getOffsetCurves(-2.0,ents) != eOk) { return Adesk::kFalse; }
for(int i =0; i (ents);
if(tmp->worldDraw(wd) != eOk)
{
// sometimes this fails but I don't know why?? ok no crash;
// acutPrintf(_T("\nFailed@tmp->worldDraw(wd)"));
}
delete tmp;
}
wd->subEntityTraits().setTrueColor(oldc);
return Adesk::kTrue;
}
return Adesk::kFalse;
}
Adesk::UInt32 DrawableOverrule::setAttributes( AcGiDrawable* pSubject, AcGiDrawableTraits * traits )
{
if(!__super::setAttributes(pSubject,traits)) { return Adesk::kFalse; }
AcDbEntity *pLine = AcDbEntity::cast(pSubject);
if(pLine == NULL) { return Adesk::kFalse; }
if(!pLine->isWriteEnabled())
{
AcDbObjectId id;
if(acdbOpenAcDbEntity(pLine,id,AcDb::kForWrite) == eOk)
{
AcCmColor color;
color.setColorIndex(1);
pLine->setColor(color);
pLine->setLineWeight(AcDb::kLnWt000);
pLine->downgradeOpen();
}
}
return Adesk::kTrue;
}
// Note Autodesk should be consistent on using bool, Adesk::Boolean
bool DrawableOverrule::isApplicable( const AcRxObject* pOverruledSubject ) const
{
if(pOverruledSubject->isKindOf(AcDbPolyline::desc()))
{
AcDbPolyline *pLine = AcDbPolyline::cast(pOverruledSubject);
// conditions we don't like
if(pLine == NULL) { return false; }
if(pLine->objectId().isNull()) { return false; }
if(!pLine->objectId().isValid()) { return false; }
if(!pLine->objectId().isResident()) { return false; }
if(!pLine->isReadEnabled()) { return false; }
if(pLine->isErased()) { return false; }
// condtions we like
if(_tcscmp(pLine->layer(), _T("0")) == 0) { return true;}
}
return false;
}
编辑错误
**** Hidden Message ***** 和命令
static int setLwDisplay(int flag)
{
resbuf rb;
rb.restype = RTSHORT;
rb.resval.rint = flag;
return acedSetVar(_T("LWDISPLAY"),&rb);
}
static int getLwDisplay(int flag)
{
resbuf rb;
acedGetVar(_T("LWDISPLAY"),&rb);
return rb.resval.rint;
}
static void enableOverrule(Adesk::Boolean flag)
{
setLwDisplay(flag);
DrawableOverrule::setIsOverruling(flag);
acedCommand(RTSTR,_T("REGEN"),0);
}
static void ArxAcGiDrawable_doit(void)
{
DrawableOverrule::addOverrule(AcDbPolyline::desc(),drawableOverrule,Adesk::kTrue);
enableOverrule(Adesk::kTrue);
}
static void ArxAcGiDrawable_undoit(void)
{
enableOverrule(Adesk::kFalse);
DrawableOverrule::removeOverrule(AcDbPolyline::desc(),drawableOverrule);
}
编辑,添加了解决方案和Arx 这是Acad 2010中的新功能,您可以在其中否决实体的绘制方式 酷,我现在明白了(主要是,必须学习更多的代码),谢谢。
保罗 多。有一个bug。
如果您使用arxacgidrawable . ARX ,
该命令用于加载
绘制一些多段线
,并用于撤消卸载 在每个顶点添加一个圆代码3] 现在最后一个
Adesk::Boolean DrawableOverrule::worldDraw(AcGiDrawable* pSubject, AcGiWorldDraw * wd )
{
if(pSubject == NULL) {return Adesk::kFalse; }
if(wd == NULL) { return Adesk::kFalse; }
if(pSubject->isKindOf(AcDbPolyline::desc()))
{
AcDbPolyline *pLine = AcDbPolyline::cast(pSubject);
if(pLine == NULL) { return Adesk::kFalse; }
if(!__super::worldDraw(pLine,wd)) { return Adesk::kFalse; }
AcCmEntityColor oldc = wd->subEntityTraits().trueColor();
AcCmEntityColor color;
if(color.setColorIndex(1) != eOk) { return Adesk::kFalse; }
wd->subEntityTraits().setTrueColor(color);
wd->subEntityTraits().setLineWeight(AcDb::kLnWt000);
AcDbVoidPtrArray ents1;
AcDbVoidPtrArray ents2;
if(pLine->getOffsetCurves(2.0,ents1) != eOk) { return Adesk::kFalse; }
if(pLine->getOffsetCurves(-2.0,ents2) != eOk) { return Adesk::kFalse; }
for(int i =0; i (ents1);
for(unsigned int j = 0 ; j numVerts() ; j++)
{
AcGePoint3d cp;
tmp->setBulgeAt(j, 0.1);
}
tmp->worldDraw(wd);
delete tmp;
}
for(int i =0; i (ents2);
for(unsigned int j = 0 ; j numVerts() ; j++)
{
AcGePoint3d cp;
tmp->setBulgeAt(j, -0.1);
}
tmp->worldDraw(wd);
delete tmp;
}
wd->subEntityTraits().setTrueColor(oldc);
return Adesk::kTrue;
}
return Adesk::kFalse;
}
那看起来不错,糟糕的是我仍然没有这个版本的AutoCAD可以玩。
我也是! 我也可以成为她的粉丝。
顺便说一句,Tony Tanzillo刚刚在这里发布了一个关于这个新功能的C#示例:
页:
[1]