明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2039|回复: 7

[求助]为何我用drawjig插入块,无法动态显示?求解!

[复制链接]
发表于 2013-11-12 12:29:10 | 显示全部楼层 |阅读模式
如题,我用drawjig从外部一个特定文件读入特定block插入到当前文档,有时能动态显示图块,大部分时候不显示,只是一个十字光标!是不是代码有问题呢?求教高人,多谢!
vs2005  c# + cad2007
  1.     public class InsertBlk : DrawJig
  2.     {
  3.         private BlockReference newBlkRef;
  4.         private Point3d mCenterPt;
  5.         Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  6.         Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

  7.         //-----------------------------------
  8.         public void InsertBlock(string strFilename, string strBlkname)
  9.         {
  10.             mCenterPt = new Point3d(0, 0, 0);
  11.             Database db = HostApplicationServices.WorkingDatabase;
  12.             Matrix3d mt = ed.CurrentUserCoordinateSystem;
  13.             PromptResult resJig;

  14.             ReadBlock(strBlkname, strFilename);
  15.                 do
  16.                 {
  17.                     Transaction tr = doc.TransactionManager.StartTransaction();
  18.                     BlockTable bt = (BlockTable)tr.GetObject(this.doc.Database.BlockTableId, OpenMode.ForRead);
  19.                     this.newBlkRef = new BlockReference(mCenterPt, bt[strBlkname]);
  20.                     tr.Commit();
  21.                     this.newBlkRef.Normal = db.Ucsxdir.CrossProduct(db.Ucsydir);
  22.                     resJig = ed.Drag(this);
  23.                     if (resJig.Status == PromptStatus.OK)
  24.                     {
  25.                         AppendEntity(this.newBlkRef);
  26.                     }
  27.                 }
  28.                 while (resJig.Status != PromptStatus.Cancel);

  29.         }
  30.         //-----------------------------------
  31.         private ObjectId AppendEntity(Entity ent)
  32.         {
  33.             ObjectId entId;
  34.             Database db = HostApplicationServices.WorkingDatabase;
  35.             using (Transaction trans = db.TransactionManager.StartTransaction())
  36.             {
  37.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  38.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  39.                 entId = btr.AppendEntity(newBlkRef);
  40.                 trans.AddNewlyCreatedDBObject(newBlkRef, true);
  41.                 trans.Commit();
  42.             }
  43.             return entId;
  44.         }
  45.         //-----------------------------------
  46.         private bool ReadBlock(string strBlkname, string strFilename)
  47.         {
  48.             using (Transaction tr = this.doc.TransactionManager.StartTransaction())
  49.             {
  50.                 using (Database db = new Database(false, true))
  51.                 {
  52.                     db.ReadDwgFile(strFilename, System.IO.FileShare.Read, true, null);
  53.                     using (Transaction trm = db.TransactionManager.StartTransaction())
  54.                     {
  55.                         BlockTable sourceBlkTbl = (BlockTable)trm.GetObject(db.BlockTableId, OpenMode.ForRead, false);
  56.                         if (!sourceBlkTbl.Has(strBlkname))
  57.                         {
  58.                             ed.WriteMessage("\n"+strBlkname+" does not exist in this dwg.");
  59.                             return false;
  60.                         }
  61.                         ObjectIdCollection blockIds = new ObjectIdCollection();
  62.                         blockIds.Add(sourceBlkTbl[strBlkname]);
  63.                         IdMapping IdMap = new IdMapping();
  64.                         db.WblockCloneObjects(blockIds, this.doc.Database.BlockTableId, IdMap, DuplicateRecordCloning.Replace ,false  );
  65.                     }
  66.                 }
  67.                 tr.Commit();
  68.             }
  69.             return true;
  70.         }
  71.         //-----------------------------------
  72.         protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  73.         {
  74.             draw.Geometry.Draw(this.newBlkRef);
  75.             return true;
  76.         }
  77.         //-----------------------------------
  78.         protected override SamplerStatus Sampler(JigPrompts prompts)
  79.         {
  80.             optJigDis.UserInputControls = UserInputControls.Accept3dCoordinates;
  81.             PromptPointResult resJigDis = prompts.AcquirePoint(optJigDis);
  82.             Point3d tempPt = resJigDis.Value;
  83.             if (resJigDis.Status == PromptStatus.Cancel)
  84.             {
  85.                 return SamplerStatus.Cancel;
  86.             }
  87.             if (mCenterPt != tempPt)
  88.             {
  89.                 mCenterPt = tempPt;
  90.                 this.newBlkRef.Position = mCenterPt;
  91.                 return SamplerStatus.OK;
  92.             }
  93.             else
  94.             {
  95.                 return SamplerStatus.NoChange;
  96.             }
  97.         }
  98.     }

该贴已经同步到 晋A青少年的微博
发表于 2013-11-12 12:52:33 | 显示全部楼层

     if (mCenterPt != tempPt)//这里想办法让鼠标点走远一点再刷新图形,比如加个公差或距离判断;目前应该是刷新太频繁了

91.
            {

92.
                mCenterPt = tempPt;

93.
                this.newBlkRef.Position = mCenterPt;

94.
                return SamplerStatus.OK;

95.
            }
发表于 2013-11-12 22:01:18 | 显示全部楼层
if (_pos.DistanceTo(ppr.Value) >= Tolerance.Global.EqualPoint)
 楼主| 发表于 2013-11-13 08:31:32 | 显示全部楼层
多谢!
if (tempPt .DistanceTo (mCenterPt )>= Tolerance .Global .EqualPoint )
不过好像效果不是很明显,十字光标也一直闪,不过我发现小的图形可以显示了,复杂点的还是看不到,总算有进展了。。。
发表于 2015-5-5 11:22:53 | 显示全部楼层
请问高手,Sampler(JigPrompts prompts)中的optJigDis提示错误,上下文不存在optJigDis,怎样解决?
发表于 2015-5-5 12:29:50 | 显示全部楼层
JigPromptPointOptions optJigDis = new JigPromptPointOptions();
发表于 2015-5-6 12:39:22 | 显示全部楼层
同求解决方法
发表于 2015-5-7 17:44:37 来自手机 | 显示全部楼层
把公差的EqualPoint设置大些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 11:55 , Processed in 0.178034 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表