乐筑天下

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

照着例子做了一个块的拖动:)

[复制链接]

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2005-7-15 10:49:00 | 显示全部楼层 |阅读模式
先建一个名为“1”的块
  1. using System;
  2. using Autodesk..DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using System.Reflection;
  7. using System.IO;
  8. using System.Collections;
  9. using System.Runtime.InteropServices;
  10. using System.Diagnostics;
  11. using Autodesk.AutoCAD.EditorInput;
  12. using Autodesk.AutoCAD.GraphicsInterface;
  13. namespace TlsCad
  14. {
  15. public class BlockRefJig:EntityJig
  16. {
  17.   Point3d mPosition,mAnglePnt;
  18.   Vector3d mNormal;
  19.   double mAngle;
  20.   int mPromptCounter;
  21.   DynamicDimensionDataCollection m_dims;
  22.   public BlockRefJig(Vector3d vec,ObjectId id):base(new BlockReference(new Point3d(0,0,0),id))
  23.   {
  24.    mPosition=new Point3d(0,0,0);
  25.    mNormal=vec;
  26.    mAngle=0;
  27.    m_dims = new DynamicDimensionDataCollection();
  28.    Dimension dim1 = new AlignedDimension();
  29.    dim1.SetDatabaseDefaults();
  30.    m_dims.Add(new DynamicDimensionData(dim1,true,true));
  31.    Dimension dim2 = new AlignedDimension();
  32.    dim2.SetDatabaseDefaults();
  33.    m_dims.Add(new DynamicDimensionData(dim2,true,true));
  34.   }
  35.   
  36.   protected  override SamplerStatus Sampler(JigPrompts prompts)
  37.   {
  38.    JigPromptOptions jigOpts = new JigPromptOptions();
  39.    jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NoZeroResponseAccepted | UserInputControls.NoNegativeResponseAccepted);
  40.    
  41.    if(mPromptCounter == 0)
  42.    {
  43.     jigOpts.Message = "\nInput InsertPoint:";
  44.     PromptPointResult dres = prompts.AcquirePoint(jigOpts);
  45.      
  46.     Point3d positionTemp = dres.Value;
  47.     if(positionTemp != mPosition)
  48.     {
  49.      mPosition = positionTemp;
  50.     }
  51.     else
  52.      return SamplerStatus.NoChange;
  53.     if(dres.Status == PromptStatus.Cancel)
  54.      return SamplerStatus.Cancel;
  55.     else
  56.      return SamplerStatus.OK;
  57.      
  58.      
  59.    }
  60.    else if (mPromptCounter == 1)
  61.    {
  62.     jigOpts.BasePoint = mPosition;
  63.     jigOpts.UseBasePoint = true;
  64.     jigOpts.Message = "\nInput Angle:";
  65.     double angleTemp = -1;
  66.     PromptPointResult res = prompts.AcquirePoint(jigOpts);
  67.     mAnglePnt = res.Value;
  68.          angleTemp = mAnglePnt.GetVectorTo(mPosition).AngleOnPlane(
  69.      new Plane(
  70.      Application.DocumentManager.MdiActiveDocument.Database.Ucsorg,
  71.      Application.DocumentManager.MdiActiveDocument.Database.Ucsxdir,
  72.      Application.DocumentManager.MdiActiveDocument.Database.Ucsydir
  73.      ));
  74.     if (angleTemp != mAngle)
  75.      mAngle = angleTemp;
  76.     else
  77.      return SamplerStatus.NoChange;
  78.     if(res.Status == PromptStatus.Cancel)
  79.      return SamplerStatus.Cancel;
  80.     else
  81.      return SamplerStatus.OK;
  82.    
  83.    }
  84.    else
  85.    {
  86.     return SamplerStatus.NoChange;
  87.    }
  88.    
  89.    
  90.   }
  91.   protected override bool Update()
  92.   {
  93.    
  94.    try
  95.    {
  96.     ((BlockReference)Entity).Position=mPosition;
  97.     ((BlockReference)Entity).Rotation =mAngle;
  98.     UpdateDimensions();
  99.      
  100.    }
  101.    catch(System.Exception)
  102.    {
  103.     return false;  
  104.    }
  105.    
  106.    return true;  
  107.   }
  108.   protected override DynamicDimensionDataCollection GetDynamicDimensionData(double dimScale)
  109.   {
  110.    return m_dims;
  111.   }
  112.   protected override void OnDimensionValueChanged(Autodesk.AutoCAD.DatabaseServices.DynamicDimensionChangedEventArgs e)
  113.   {
  114.    
  115.   }
  116.   void UpdateDimensions()
  117.   {
  118.    BlockReference blkref = (BlockReference)Entity;
  119.    if(mPromptCounter == 0)
  120.    {
  121.     AlignedDimension dim1 = (AlignedDimension)m_dims[0].Dimension;
  122.     dim1.XLine1Point = blkref.Position;
  123.     dim1.DimLinePoint = blkref.Position;
  124.    }
  125.    else
  126.    {
  127.     Ellipse myellipse = (Ellipse)Entity;
  128.     AlignedDimension dim2 = (AlignedDimension)m_dims[1].Dimension;
  129.     dim2.XLine1Point = blkref.Position;
  130.     dim2.XLine2Point = mAnglePnt;
  131.     dim2.DimLinePoint = blkref.Position;
  132.    }
  133.   }
  134.   public void setPromptCounter(int i)
  135.   {
  136.    mPromptCounter = i;
  137.   }
  138.   public Entity GetEntity()
  139.   {
  140.    return Entity;
  141.   }  [CommandMethod("tjig")]
  142.   static public void DoIt()
  143.   {
  144.    Vector3d x = Application.DocumentManager.MdiActiveDocument.Database.Ucsxdir;
  145.    Vector3d y = Application.DocumentManager.MdiActiveDocument.Database.Ucsydir;
  146.    Vector3d NormalVec = x.CrossProduct(y);
  147.   
  148.    using (TlsTM tm = new TlsTM(true))
  149.    {              
  150.   
  151.    BlockTable pbt=(BlockTable)tm.AutoCadTM.GetObject(tm.Database.BlockTableId, OpenMode.ForRead,true);
  152.    BlockRefJig jig = new BlockRefJig(NormalVec,pbt["1"]);
  153.    jig.setPromptCounter(0);
  154.    Application.DocumentManager.MdiActiveDocument.Editor.Drag(jig);
  155.    jig.setPromptCounter(1);
  156.    Application.DocumentManager.MdiActiveDocument.Editor.Drag(jig);
  157.     tm.OpenBlockTableRecord(BlockTableRecord.ModelSpace);
  158.     tm.Add(jig.GetEntity());
  159.    }
  160.    
  161.   }
  162. }
  163. public class TlsTM:IDisposable
  164. {
  165.   private Database db;
  166.   private AutoCadTM tm;
  167.   private Transaction ta;
  168.   private BlockTable bt;
  169.   private BlockTableRecord btr;
  170.   private bool IsStarted=false;
  171.   public TlsTM(bool Starting)
  172.   {
  173.    if(Starting)
  174.    {
  175.     db = HostApplicationServices.WorkingDatabase;
  176.     tm = db.TransactionManager;
  177.     ta = tm.StartTransaction();
  178.    }
  179.     IsStarted=Starting;
  180.   }  public Editor Editor
  181.   {
  182.    get
  183.    {
  184.     return Application.DocumentManager.MdiActiveDocument.Editor;
  185.    }
  186.   }
  187.   public Database Database
  188.   {
  189.    get
  190.    {
  191.     return db;
  192.    }
  193.   }
  194.   public AutoCadTM AutoCadTM
  195.   {
  196.    get
  197.    {
  198.     return tm;
  199.    }
  200.   }
  201.   public Transaction Transaction
  202.   {
  203.    get
  204.    {
  205.     return ta;
  206.    }
  207.   }
  208.   public BlockTable BlockTable
  209.   {
  210.    get
  211.    {
  212.     return bt;
  213.    }
  214.   }
  215.   public BlockTableRecord BlockTableRecord
  216.   {
  217.    get
  218.    {
  219.     return btr;
  220.    }
  221.   }  #region Add Entity
  222.    public ObjectId Add(Entity entity)
  223.    {
  224.     ObjectId id = btr.AppendEntity(entity);
  225.     tm.AddNewlyCreatedDBObject(entity, true);
  226.     return id;
  227.    }
  228.    public ObjectIdCollection Add(DBObjectCollection objs)
  229.    {
  230.     ObjectIdCollection ids = new ObjectIdCollection();
  231.     foreach(DBObject obj in objs)
  232.     {
  233.      ids.Add(this.Add((Entity)obj));
  234.     }
  235.     return ids;
  236.    }
  237.    public ObjectIdCollection Add(DBObject[] objs)
  238.    {
  239.     ObjectIdCollection ids = new ObjectIdCollection();
  240.     foreach(DBObject obj in objs)
  241.     {
  242.      ids.Add(this.Add((Entity)obj));
  243.     }
  244.     return ids;
  245.    }
  246.   #endregion
  247.   #region Remove Entity
  248.    public bool Remove(ObjectId id)
  249.    {
  250.     DBObject obj;
  251.     try
  252.     {
  253.      obj = tm.GetObject(id,OpenMode.ForWrite);
  254.      obj.Erase(true);
  255.     }
  256.     catch
  257.     {
  258.      return false;
  259.     }
  260.     return true;
  261.    }
  262.    public bool Remove(ObjectIdCollection ids)
  263.    {
  264.     foreach(ObjectId id in ids)
  265.     {
  266.      try
  267.      {
  268.       DBObject obj;
  269.       obj = tm.GetObject(id,OpenMode.ForWrite);
  270.       obj.Erase(true);
  271.      }
  272.      catch
  273.      {
  274.       return false;
  275.      }
  276.     }
  277.     return true;
  278.    }
  279.    public bool Remove(ObjectId[] ids)
  280.    {
  281.     foreach(ObjectId id in ids)
  282.     {
  283.      try
  284.      {
  285.       DBObject obj;
  286.       obj = tm.GetObject(id,OpenMode.ForWrite);
  287.       obj.Erase(true);
  288.      }
  289.      catch
  290.      {
  291.       return false;
  292.      }
  293.     }
  294.     return true;
  295.    }
  296.   #endregion
  297.   #region Trans
  298.   public void OpenBlockTableRecord(string str)
  299.   {
  300.    bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false);
  301.    btr = (BlockTableRecord)tm.GetObject(bt[str], OpenMode.ForWrite, false);
  302.   }
  303.   public Entity GetObject(ObjectId id,OpenMode mode)
  304.   {
  305.    return (Entity)tm.GetObject(id,mode,true);
  306.   }
  307.   void IDisposable.Dispose()
  308.   {
  309.    if(IsStarted)
  310.    {
  311.     ta.Commit();
  312.    }
  313.    ta.Dispose();
  314.   }
  315.   #endregion
  316.   public void RegApp(string AppName)
  317.   {
  318.    RegAppTable tbl = (RegAppTable)tm.GetObject(db.RegAppTableId, OpenMode.ForWrite, false);
  319.    if(!tbl.Has(AppName))
  320.    {
  321.     RegAppTableRecord app = new RegAppTableRecord();
  322.     app.Name = AppName;
  323.     tbl.Add(app);
  324.     tm.AddNewlyCreatedDBObject(app, true);
  325.    }
  326.   }
  327. }
  328. }
回复

使用道具 举报

12

主题

68

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
116
发表于 2005-7-15 14:42:00 | 显示全部楼层
第一个支持。研究研究。
回复

使用道具 举报

46

主题

261

帖子

8

银币

后起之秀

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

铜币
445
发表于 2005-7-15 21:32:00 | 显示全部楼层
飞狐,能不能用VB。NET写一下!
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2005-7-18 12:36:00 | 显示全部楼层
把代码编译为Dll后,可以在VB.Net里引用的,用VB.Net写一下就比较头痛了:)
回复

使用道具 举报

1

主题

8

帖子

1

银币

初来乍到

Rank: 1

铜币
12
发表于 2005-7-18 19:08:00 | 显示全部楼层
可以把dll传上来吗?硬盘太小,没有装C#
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2005-7-20 12:11:00 | 显示全部楼层
我把这里改过了,想输入角度,直接输入值没问题,但鼠标动作时有问题,郁闷
  protected  override SamplerStatus Sampler(JigPrompts prompts)
  {
   JigPromptOptions jigOpts = new JigPromptOptions();
   jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NoZeroResponseAccepted | UserInputControls.NoNegativeResponseAccepted );
   
   if(mPromptCounter == 0)
   {
    jigOpts.Message = "\n请输入基点:";
   &nbspromptPointResult dres = prompts.AcquirePoint(jigOpts);
     
   &nbspoint3d positionTemp = dres.Value;
    if(positionTemp != mPosition)
    {
     mPosition = positionTemp;
    }
    else
     return SamplerStatus.NoChange;
    if(dres.Status == PromptStatus.Cancel)
     return SamplerStatus.Cancel;
    else
     return SamplerStatus.OK;
     
     
   }
   else if (mPromptCounter == 1)
   {
    jigOpts.BasePoint = mPosition;
    jigOpts.UseBasePoint = true;
    jigOpts.Message = "\n请输入旋转角度:";
    double angleTemp = -1;
   &nbspromptDoubleResult res = prompts.AcquireAngle(jigOpts);
    angleTemp = res.Value;
    if (angleTemp != mAngle)
     mAngle = angleTemp;
    else
     return SamplerStatus.NoChange;
    if(res.Status == PromptStatus.Cancel)
     return SamplerStatus.Cancel;
    else
     return SamplerStatus.OK;
   
   }
   else
   {
    return SamplerStatus.NoChange;
   }
   
   
  }

回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2005-7-20 16:58:00 | 显示全部楼层
感觉AcquireAngle好像取的是距离,难道是个BUG?
回复

使用道具 举报

15

主题

22

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2007-4-18 14:37:00 | 显示全部楼层
在autocad2006下不能运行
回复

使用道具 举报

12

主题

24

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
72
发表于 2007-7-17 19:29:00 | 显示全部楼层
代码中还是有几处问题,修改后成功了,但有些问题很困惑
1.用F8运行,为什么出现问题 ,要求输入点的地方不停顿,F5就行
2.把块删掉后 PURGE 重建一个,就不能正确运行了,是什么原因
lzh741206版主能加我QQ:79850399
回复

使用道具 举报

2

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
19
发表于 2007-8-17 15:44:00 | 显示全部楼层
AutoCadTM说缺少using指令集或程序集引用怎么回事!
我是新手请大家多多指导!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 10:29 , Processed in 0.199463 second(s), 72 queries .

© 2020-2024 乐筑天下

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