乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 140|回复: 9

我的否决样本

[复制链接]

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-4-10 01:09:27 | 显示全部楼层 |阅读模式
似乎可以工作
.h
  1. #pragma once
  2. class DrawableOverrule : public AcGiDrawableOverrule
  3. {
  4. public:
  5.   DrawableOverrule(void);
  6.   virtual ~DrawableOverrule(void);
  7.   virtual Adesk::Boolean worldDraw(AcGiDrawable* pSubject, AcGiWorldDraw * wd);
  8.   virtual Adesk::UInt32 setAttributes (AcGiDrawable* pSubject, AcGiDrawableTraits * traits);
  9.   virtual bool isApplicable(const AcRxObject* pOverruledSubject) const;
  10. };

.cpp
  1. #include "StdAfx.h"
  2. #include "DrawableOverrule.h"
  3. DrawableOverrule::DrawableOverrule(void)
  4. {
  5. }
  6. DrawableOverrule::~DrawableOverrule(void)
  7. {
  8. }
  9. Adesk::Boolean DrawableOverrule::worldDraw(AcGiDrawable* pSubject, AcGiWorldDraw * wd )
  10. {
  11.   if(pSubject == NULL) {  return Adesk::kFalse; }
  12.   if(wd == NULL) { return Adesk::kFalse; }
  13.   if(pSubject->isKindOf(AcDbPolyline::desc()))
  14.   {
  15.     AcDbPolyline *pLine = AcDbPolyline::cast(pSubject);
  16.     if(pLine == NULL) { return Adesk::kFalse; }
  17.     if(!__super::worldDraw(pLine,wd)) { return Adesk::kFalse; }
  18.     AcCmEntityColor oldc = wd->subEntityTraits().trueColor();
  19.     AcCmEntityColor color;
  20.     if(color.setColorIndex(1) != eOk) { return Adesk::kFalse; }
  21.     wd->subEntityTraits().setTrueColor(color);
  22.     wd->subEntityTraits().setLineWeight(AcDb::kLnWt000);
  23.     AcDbVoidPtrArray ents;
  24.     if(pLine->getOffsetCurves(2.0,ents) != eOk) { return Adesk::kFalse; }
  25.     if(pLine->getOffsetCurves(-2.0,ents) != eOk) { return Adesk::kFalse; }
  26.     for(int i =  0; i (ents[i]);
  27.       if(tmp->worldDraw(wd) != eOk)
  28.       {
  29.         // sometimes this fails but I don't know why?? ok no crash;
  30.         // acutPrintf(_T("\nFailed@tmp->worldDraw(wd)"));
  31.       }
  32.       delete tmp;
  33.     }
  34.     wd->subEntityTraits().setTrueColor(oldc);
  35.     return Adesk::kTrue;
  36.   }
  37.   return Adesk::kFalse;
  38. }
  39. Adesk::UInt32 DrawableOverrule::setAttributes( AcGiDrawable* pSubject, AcGiDrawableTraits * traits )
  40. {
  41.   if(!__super::setAttributes(pSubject,traits)) { return Adesk::kFalse; }
  42.   AcDbEntity *pLine = AcDbEntity::cast(pSubject);
  43.   if(pLine == NULL) { return Adesk::kFalse; }
  44.   if(!pLine->isWriteEnabled())
  45.   {
  46.     AcDbObjectId id;
  47.     if(acdbOpenAcDbEntity(pLine,id,AcDb::kForWrite) == eOk)
  48.     {
  49.      AcCmColor color;
  50.      color.setColorIndex(1);
  51.      pLine->setColor(color);
  52.      pLine->setLineWeight(AcDb::kLnWt000);
  53.      pLine->downgradeOpen();
  54.     }
  55.   }
  56.   return Adesk::kTrue;
  57. }
  58. // Note Autodesk should be consistent on using bool, Adesk::Boolean
  59. bool DrawableOverrule::isApplicable( const AcRxObject* pOverruledSubject ) const
  60. {
  61.   if(pOverruledSubject->isKindOf(AcDbPolyline::desc()))
  62.   {
  63.     AcDbPolyline *pLine = AcDbPolyline::cast(pOverruledSubject);
  64.     // conditions we don't like
  65.     if(pLine == NULL)                         { return false; }
  66.     if(pLine->objectId().isNull())            { return false; }
  67.     if(!pLine->objectId().isValid())          { return false; }
  68.     if(!pLine->objectId().isResident())       { return false; }
  69.     if(!pLine->isReadEnabled())               { return false; }
  70.     if(pLine->isErased())                     { return false; }
  71.     // condtions we like
  72.     if(_tcscmp(pLine->layer(), _T("0")) == 0) { return true;  }
  73.   }
  74.   return false;
  75. }

编辑错误

dpisszfgu0b.png

dpisszfgu0b.png

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-4-10 01:13:23 | 显示全部楼层
和命令
  1. static int setLwDisplay(int flag)
  2. {
  3.    resbuf rb;
  4.    rb.restype = RTSHORT;
  5.    rb.resval.rint = flag;
  6.    return acedSetVar(_T("LWDISPLAY"),&rb);
  7. }
  8. static int getLwDisplay(int flag)
  9. {
  10.    resbuf rb;
  11.    acedGetVar(_T("LWDISPLAY"),&rb);
  12.    return rb.resval.rint;
  13. }
  14. static void enableOverrule(Adesk::Boolean flag)
  15. {
  16.    setLwDisplay(flag);
  17.    DrawableOverrule::setIsOverruling(flag);
  18.    acedCommand(RTSTR,_T("REGEN"),0);
  19. }
  20. static void ArxAcGiDrawable_doit(void)
  21. {
  22.    DrawableOverrule::addOverrule(AcDbPolyline::desc(),drawableOverrule,Adesk::kTrue);
  23.    enableOverrule(Adesk::kTrue);
  24. }
  25. static void ArxAcGiDrawable_undoit(void)
  26. {
  27.    enableOverrule(Adesk::kFalse);
  28.    DrawableOverrule::removeOverrule(AcDbPolyline::desc(),drawableOverrule);
  29. }

编辑,添加了解决方案和Arx
回复

使用道具 举报

46

主题

261

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
445
发表于 2009-4-10 01:18:51 | 显示全部楼层
这是Acad 2010中的新功能,您可以在其中否决实体的绘制方式
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-4-10 01:22:11 | 显示全部楼层
酷,我现在明白了(主要是,必须学习更多的代码),谢谢。
保罗
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-4-10 01:31:55 | 显示全部楼层
多。有一个bug。
如果您使用arxacgidrawable . ARX ,
该命令用于加载
绘制一些多段线
,并用于撤消卸载
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-4-10 02:10:35 | 显示全部楼层
在每个顶点添加一个圆代码3]
回复

使用道具 举报

46

主题

261

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
445
发表于 2009-4-10 02:30:05 | 显示全部楼层
现在最后一个
  1. Adesk::Boolean DrawableOverrule::worldDraw(AcGiDrawable* pSubject, AcGiWorldDraw * wd )
  2. {
  3.   if(pSubject == NULL) {  return Adesk::kFalse; }
  4.   if(wd == NULL) { return Adesk::kFalse; }
  5.   if(pSubject->isKindOf(AcDbPolyline::desc()))
  6.   {
  7.     AcDbPolyline *pLine = AcDbPolyline::cast(pSubject);
  8.     if(pLine == NULL) { return Adesk::kFalse; }
  9.     if(!__super::worldDraw(pLine,wd)) { return Adesk::kFalse; }
  10.     AcCmEntityColor oldc = wd->subEntityTraits().trueColor();
  11.     AcCmEntityColor color;
  12.     if(color.setColorIndex(1) != eOk) { return Adesk::kFalse; }
  13.     wd->subEntityTraits().setTrueColor(color);
  14.     wd->subEntityTraits().setLineWeight(AcDb::kLnWt000);
  15.     AcDbVoidPtrArray ents1;
  16.     AcDbVoidPtrArray ents2;
  17.     if(pLine->getOffsetCurves(2.0,ents1) != eOk) { return Adesk::kFalse; }
  18.     if(pLine->getOffsetCurves(-2.0,ents2) != eOk) { return Adesk::kFalse; }
  19.     for(int i =  0; i (ents1[i]);
  20.       for(unsigned int j = 0 ; j numVerts() ; j++)
  21.       {
  22.         AcGePoint3d cp;
  23.         tmp->setBulgeAt(j, 0.1);
  24.       }
  25.       tmp->worldDraw(wd);
  26.       delete tmp;
  27.     }
  28.     for(int i =  0; i (ents2[i]);
  29.       for(unsigned int j = 0 ; j numVerts() ; j++)
  30.       {
  31.         AcGePoint3d cp;
  32.         tmp->setBulgeAt(j, -0.1);
  33.       }
  34.       tmp->worldDraw(wd);
  35.       delete tmp;
  36.     }
  37.     wd->subEntityTraits().setTrueColor(oldc);
  38.     return Adesk::kTrue;
  39.   }
  40.   return Adesk::kFalse;
  41. }

回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-4-10 08:53:36 | 显示全部楼层
那看起来不错,糟糕的是我仍然没有这个版本的AutoCAD可以玩。
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-4-10 09:47:32 | 显示全部楼层

我也是!
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-4-11 12:27:33 | 显示全部楼层
我也可以成为她的粉丝。
顺便说一句,Tony Tanzillo刚刚在这里发布了一个关于这个新功能的C#示例:
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-6 03:53 , Processed in 0.205594 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表