pkohut 发表于 2009-4-10 01:09:27

我的否决样本

似乎可以工作
.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 *****

pkohut 发表于 2009-4-10 01:13:23

和命令
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

ahlzl 发表于 2009-4-10 01:18:51

这是Acad 2010中的新功能,您可以在其中否决实体的绘制方式

Kerry 发表于 2009-4-10 01:22:11

酷,我现在明白了(主要是,必须学习更多的代码),谢谢。
保罗

Kerry 发表于 2009-4-10 01:31:55

多。有一个bug。
如果您使用arxacgidrawable . ARX ,
该命令用于加载
绘制一些多段线
,并用于撤消卸载

Kerry 发表于 2009-4-10 02:10:35

在每个顶点添加一个圆代码3]

ahlzl 发表于 2009-4-10 02:30:05

现在最后一个
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;
}

Kerry 发表于 2009-4-10 08:53:36

那看起来不错,糟糕的是我仍然没有这个版本的AutoCAD可以玩。

Kerry 发表于 2009-4-10 09:47:32


我也是!

Kerry 发表于 2009-4-11 12:27:33

我也可以成为她的粉丝。
顺便说一句,Tony Tanzillo刚刚在这里发布了一个关于这个新功能的C#示例:
页: [1]
查看完整版本: 我的否决样本