明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3216|回复: 11

拖出来咋这个效果呢?

  [复制链接]
发表于 2011-9-2 11:48:06 | 显示全部楼层 |阅读模式
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6. using System.Collections.Generic;
  7. [assembly: CommandClass(typeof(CAD0901.JigClass))]
  8. namespace CAD0901
  9. {
  10.     class JigClass : DrawJig
  11.     {
  12.         private Polyline pl=new Polyline();
  13.         private Point3d p1;
  14.         private Point3d p2;
  15.        [CommandMethod("jc")]
  16.         public void MyTest()
  17.         {
  18.             
  19.                
  20.                 Database db = HostApplicationServices.WorkingDatabase;
  21.                 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  22.                 try
  23.                 {
  24.                     Matrix3d mx = ed.CurrentUserCoordinateSystem;
  25.                     PromptPointOptions ppo = new PromptPointOptions("\n第一点");
  26.                     PromptPointResult ppr = ed.GetPoint(ppo);
  27.                     p1 = ppr.Value;
  28.                  using (Transaction trans = db.TransactionManager.StartTransaction())
  29.                  {
  30.                      BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
  31.                          OpenMode.ForRead);
  32.                      BlockTableRecord btr = (BlockTableRecord)trans.GetObject
  33.                          (bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  34.                      PromptResult resJig = ed.Drag(this);
  35.                      if (resJig.Status == PromptStatus.OK)
  36.                      {
  37.                      btr.AppendEntity(pl);
  38.                      trans.AddNewlyCreatedDBObject(pl, true);
  39.                      trans.Commit();
  40.                      }
  41.                  }
  42.             }
  43.             catch (Exception ex)
  44.             {
  45.                
  46.             }
  47.         
  48.         }
  49.         protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  50.         {
  51.             draw.Geometry.Draw(pl);
  52.             return true;
  53.         }

  54.         protected override SamplerStatus Sampler(JigPrompts prompts)
  55.         {
  56.             JigPromptPointOptions jpo = new JigPromptPointOptions("\n另一点");
  57.             jpo.UserInputControls = UserInputControls.Accept3dCoordinates;
  58.             PromptPointResult pr = prompts.AcquirePoint(jpo);
  59.             Point3d tempt = pr.Value;
  60.             if (pr.Status==PromptStatus.Cancel)
  61.             {
  62.                 return SamplerStatus.Cancel;
  63.             }
  64.             if (p2!= tempt)
  65.             {
  66.                 p2 = tempt;
  67.                 pl.AddVertexAt(0, new Point2d(p1.X, p1.Y), 0, 0, 0);
  68.                 pl.AddVertexAt(1, new Point2d(p2.X, p1.Y), 0, 0, 0);
  69.                 pl.AddVertexAt(2, new Point2d(p2.X, p2.Y), 0, 0, 0);
  70.                 pl.AddVertexAt(3, new Point2d(p1.X, p2.Y), 0, 0, 0);
  71.                 pl.Closed = true;
  72.                 return SamplerStatus.OK;
  73.             }
  74.             else return SamplerStatus.NoChange;
  75.         }
  76.         private ObjectId AppendEntity(Entity ent)
  77.         {
  78.             ObjectId entId;
  79.             Database db = HostApplicationServices.WorkingDatabase;
  80.             using (Transaction trans = db.TransactionManager.StartTransaction())
  81.             {
  82.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
  83.                     OpenMode.ForRead);
  84.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject
  85.                     (bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  86.                 entId = btr.AppendEntity(ent);
  87.                 trans.AddNewlyCreatedDBObject(ent, true);
  88.                 trans.Commit();
  89.             }
  90.             return entId;
  91.         }

  92.         

  93.     }
  94. }
上面这段程序,拖出一个矩形框,结果悲剧了……
我该怎么改呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2011-9-2 12:26:31 | 显示全部楼层
快来看看呀……
发表于 2011-9-2 13:34:13 | 显示全部楼层
        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
//////////////////////////////////////////////
这里加一次点就够了
            if (p2!= tempt)
            {
                p2 = tempt;
                pl.AddVertexAt(0, new Point2d(p1.X, p1.Y), 0, 0, 0);
                pl.AddVertexAt(1, new Point2d(p2.X, p1.Y), 0, 0, 0);
                pl.AddVertexAt(2, new Point2d(p2.X, p2.Y), 0, 0, 0);
                pl.AddVertexAt(3, new Point2d(p1.X, p2.Y), 0, 0, 0);
                pl.Closed = true;
                return SamplerStatus.OK;
            }      
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        }

发表于 2011-9-2 13:35:11 | 显示全部楼层
加一次后是修改点的位置,而不是再加新点
 楼主| 发表于 2011-9-2 14:11:47 | 显示全部楼层
sieben 发表于 2011-9-2 13:34
protected override SamplerStatus Sampler(JigPrompts prompts)
        {
/////////////////// ...

你的意思是:这里只保留 p2 = tempt;
下面添加多段线顶点的代码提到上面去?
好像也不行呀!
发表于 2011-9-2 14:19:09 | 显示全部楼层
拜托!你想画一个矩形对吧?矩形一共只有4个点对吧?
          pl.AddVertexAt(0, new Point2d(p1.X, p1.Y), 0, 0, 0);
                pl.AddVertexAt(1, new Point2d(p2.X, p1.Y), 0, 0, 0);
                pl.AddVertexAt(2, new Point2d(p2.X, p2.Y), 0, 0, 0);
                pl.AddVertexAt(3, new Point2d(p1.X, p2.Y), 0, 0, 0);
pl.AddVertexAt(0, new Point2d(p1.X, p1.Y), 0, 0, 0); 是往多段线加点对吧?你不停的加,那这个多段线会是几个节点?
 楼主| 发表于 2011-9-2 14:34:39 | 显示全部楼层
sieben 发表于 2011-9-2 14:19
拜托!你想画一个矩形对吧?矩形一共只有4个点对吧?
          pl.AddVertexAt(0, new Point2d(p1.X, p1.Y), ...

[em0],我对JIG是如何作用的一直没搞明白,您的意思是说不需要if语句吗?
我实在是不太懂这个,还望大哥悉心指导一下……
发表于 2011-9-2 14:44:55 | 显示全部楼层
建议你仔细看看你目前出来的多段线,仔细看,放大来看.或许这样你能明白你的问题所在;
 楼主| 发表于 2011-9-2 21:56:33 | 显示全部楼层
sieben 发表于 2011-9-2 14:44
建议你仔细看看你目前出来的多段线,仔细看,放大来看.或许这样你能明白你的问题所在;
  1. protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  2.         {
  3.             pl = new Polyline();
  4.             pl.AddVertexAt(0, new Point2d(p1.X, p1.Y), 0, 0, 0);
  5.             pl.AddVertexAt(1, new Point2d(p2.X, p1.Y), 0, 0, 0);
  6.             pl.AddVertexAt(2, new Point2d(p2.X, p2.Y), 0, 0, 0);
  7.             pl.AddVertexAt(3, new Point2d(p1.X, p2.Y), 0, 0, 0);
  8.             pl.Closed = true;
  9.             draw.Geometry.Draw(pl);
  10.             return true;
  11.         }
复制代码
siben兄,
    终于发现问题所在了,把添加顶点的代码添加到WorldDraw方法中就OK了,谢谢你的指点哈
发表于 2011-9-3 01:30:43 | 显示全部楼层
本帖最后由 sieben 于 2011-9-3 01:31 编辑
家在湾里 发表于 2011-9-2 21:56
siben兄,
    终于发现问题所在了,把添加顶点的代码添加到WorldDraw方法中就OK了,谢谢你的指点哈[em1 ...


这样或许实现了你的需求,但我认为不应该这样做,因为若实现的功能若再复杂些,你将会很难处理;
另外,目前的做法是无数次的生成了一个转眼就被自杀的new polyline,实在是劳心劳力的做些无用工.
幸好.Net的垃圾收集机制或许处理了你遗留的东西.

另:我是Sieben
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 20:45 , Processed in 0.204620 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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