乐筑天下

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

工作坐标系

[复制链接]

2

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
11
发表于 2011-11-5 00:15:00 | 显示全部楼层 |阅读模式

xqjseybiir5.jpg

xqjseybiir5.jpg


附上代码:
[CommandMethod("NCS")]
        public void NCS()
        {
            //获得当前文档和数据库,并启动一个事务
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                //以读的方式打开UCS表
                UcsTable acUCSTbl;
                acUCSTbl = acTrans.GetObject(acCurDb.UcsTableId, OpenMode.ForRead) as UcsTable;
                // 以只读方式打开视图表  Open the View table for read
                UcsTableRecord acUCSTblRec;
                //检查看“New_UCS”用户坐标系表记录是否存在
                if (acUCSTbl.Has("Layout_UCS") == false)
                {
                    acUCSTblRec = new UcsTableRecord();
                    acUCSTblRec.Name = "Layout_UCS";
                    //以写的方式打开UCSTable
                    acUCSTbl.UpgradeOpen();
                    //添加新的 UCS 表记录
                    acUCSTbl.Add(acUCSTblRec);
                    acTrans.AddNewlyCreatedDBObject(acUCSTblRec, true);
                }
                else
                {
                    acUCSTblRec = acTrans.GetObject(acUCSTbl["Layout_UCS"],
                                                    OpenMode.ForWrite) as UcsTableRecord;
                }
                acUCSTblRec.Origin = new Point3d(100, 100, 0);
                acUCSTblRec.XAxis = new Vector3d(1, 0, 0);
                acUCSTblRec.YAxis = new Vector3d(0, 1, 0);
                // 以只读方式打开视口表
                ViewportTable acVportTbl;
                acVportTbl = acTrans.GetObject(acCurDb.ViewportTableId,
                                               OpenMode.ForRead) as ViewportTable;
                // 以写的方式打开视图表
                acVportTbl.UpgradeOpen();
                // 遍历符号表的每一个对象
                foreach (ObjectId acObjId in acVportTbl)
                {
                    //以写方式打开对象
                    ViewportTableRecord acVportTblRec;
                    acVportTblRec = acTrans.GetObject(acObjId, OpenMode.ForWrite) as ViewportTableRecord;
                    // 判断是否是活动窗口,如果是就删除  See if it is one of the active viewports, and if so erase it
                    if (acVportTblRec.Name == "*Active")
                    {
                        acVportTblRec.IconAtOrigin = true;
                        acVportTblRec.IconEnabled = true;
                        acVportTblRec.SetUcs(acUCSTblRec.ObjectId);
                        acDoc.Editor.UpdateTiledViewportsFromDatabase();
                        UcsTableRecord acUCSTblRecActive;
                        acUCSTblRecActive = acTrans.GetObject(acVportTblRec.UcsName,
                                                              OpenMode.ForRead) as UcsTableRecord;
                        CAD.CurrentEditor.WriteMessage("当前坐标系为: " + acUCSTblRecActive.Name);
                        Point3d center = new Point3d(0, 0, 0); //定义圆的中心
                        double radius = 50;
                        Circle circle = new Circle(center, new Vector3d(0.0, 0.0, 1.0), radius);
                        //获得块表,AutoCAD将加入到图形中的对象的信息都放在这个表中
                        BlockTable bt = (BlockTable)CAD.CurrentTransactionManager.GetObject(CAD.CurrentDatabase.BlockTableId, OpenMode.ForRead, false);
                        //获得块表记录
                        BlockTableRecord btr = (BlockTableRecord)
                        CAD.CurrentTransactionManager.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
                        //向块表记录加入圆的相关信息
                        btr.AppendEntity(circle);
                        //向AutoCAD加入圆
                        CAD.CurrentTransactionManager.AddNewlyCreatedDBObject(circle, true);
                        // 保存新对象到数据库中
                        acTrans.Commit();
                    }
                }
            }
        }
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2011-11-5 08:11:00 | 显示全部楼层
Vector3d tVec1 = acDoc.Database.Ucsorg.GetAsVector(); 或 Vector3d tVec1 =new Vector3d(100, 1000, 0);
Circle circle = new Circle(center + tVec1 , new Vector3d(0.0, 0.0, 1.0), radius);
对于实体的操作使用的应该都是世界坐标系WCS
回复

使用道具 举报

0

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
4
发表于 2011-11-5 09:10:00 | 显示全部楼层
谢谢兄弟帮忙!
回复

使用道具 举报

0

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
4
发表于 2011-11-5 09:39:00 | 显示全部楼层

我在建坐标系时也出现相同问题,请各位帮帮忙啊 ,刚学二次开发:
1.以wcs为基准,新建ucs1
2.以ucs1为基准,新建ucs2
3.相同代码,ucs1位置正确了,但ucs2就不对了,它的圆心位置仍然是以wcs为准了,而我想以ucs1为基准。

hiot0xrmsph.jpg

hiot0xrmsph.jpg



public static void DrawingLayout(double[] orgPt, double length, double width, double height)
        {
            //初始化绝对坐标系
            IniLayout.TCS("ABS", new double[3] { 0, 0, 0 });
            CAD.CreateCircle(new double[4] { 0, 0, 0, 50 });
            //初始化坐标系ucs1:
            IniLayout.TCS("ucs1", orgPt);
            CAD.CreateCircle(new double[4] { 0, 0, 0, 50 });
            //初始化坐标系ucs2:
            double[] p = new double[3];
            p[0] = 1000 + length / 2;
            p[1] = 1000 + width / 2;
            p[2] = 0;
            IniLayout.TCS("ucs2", p);
            CAD.CreateCircle(new double[4] { 0, 0, 0, 50 });

   ///
        /// 给定原点,创建坐标系
        ///
        public static void TCS(String ucsName, double[] p)
        {
            using (DocumentLock docLock = CAD.CurrentDocument.LockDocument())   //注意此句,如果自定义对话框与CAD交互,一定要锁定文档
            {
                //获得当前文档和数据库,并启动一个事务,开始事务处理
                using (Transaction acTrans = CAD.CurrentDatabase.TransactionManager.StartTransaction())
                {
                    //以读的方式打开UCS表
                    UcsTable acUCSTbl;
                    acUCSTbl = acTrans.GetObject(CAD.CurrentDatabase.UcsTableId, OpenMode.ForRead) as UcsTable;
                    //检查看0cs用户坐标系表记录是否存在
                    try
                    {
                        UcsTableRecord acUCSTblRec;
                        if (acUCSTbl.Has(ucsName) == false)
                        {
                            acUCSTblRec = new UcsTableRecord();
                            acUCSTblRec.Name = ucsName;
                            acUCSTbl.UpgradeOpen();
                            //添加新的 UCS 表记录
                            acUCSTbl.Add(acUCSTblRec);
                            acTrans.AddNewlyCreatedDBObject(acUCSTblRec, true);
                        }
                        else
                        {
                            acUCSTblRec = acTrans.GetObject(acUCSTbl[ucsName], OpenMode.ForWrite) as UcsTableRecord;
                        }
                        CAD.CurrentEditor.WriteMessage(p[0].ToString() + ">" + p[1].ToString() + "\n");
                        acUCSTblRec.Origin = new Point3d(p[0], p[1], p[2]);
                        acUCSTblRec.XAxis = new Vector3d(1, 0, 0);
                        acUCSTblRec.YAxis = new Vector3d(0, 1, 0);
                        // 以只读方式打开视口表
                        ViewportTable acVportTbl;
                        acVportTbl = acTrans.GetObject(CAD.CurrentDatabase.ViewportTableId,
                                                       OpenMode.ForRead) as ViewportTable;
                        // 以写的方式打开视图表
                        acVportTbl.UpgradeOpen();
                        // 遍历符号表的每一个对象
                        foreach (ObjectId acObjId in acVportTbl)
                        {
                            //以写方式打开对象
                            ViewportTableRecord acVportTblRec;
                            acVportTblRec = acTrans.GetObject(acObjId, OpenMode.ForWrite) as ViewportTableRecord;
                            // 判断是否是活动窗口
                            if (acVportTblRec.Name == "*Active")
                            {
                                acVportTblRec.IconAtOrigin = true;
                                acVportTblRec.IconEnabled = true;
                                acVportTblRec.SetUcs(acUCSTblRec.ObjectId);
                                CAD.CurrentDocument.Editor.UpdateTiledViewportsFromDatabase();
                                UcsTableRecord acUCSTblRecActive;
                                acUCSTblRecActive = acTrans.GetObject(acVportTblRec.UcsName,
                                                                      OpenMode.ForRead) as UcsTableRecord;
                                CAD.CurrentEditor.WriteMessage("\n当前坐标系为: " + acUCSTblRecActive.Name);
                                // 保存新对象到数据库中
                                acTrans.Commit();
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
                }
            }
        }
回复

使用道具 举报

0

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
4
发表于 2011-11-5 09:50:00 | 显示全部楼层
public static ObjectId CreateCircle(double[] p)
        {
            ObjectId entId = ObjectId.Null;
            using (DocumentLock docLock = CAD.CurrentDocument.LockDocument())
            {
                CAD.CurrentEditor.WriteMessage("\n" + p[0].ToString()+" "+p[1].ToString()+" "+ p[2].ToString()+" " + p[3].ToString()+"\n");
                Point3d center = new Point3d(p[0], p[1], p[2]);
                Vector3d tVec1 = CAD.CurrentDocument.Database.Ucsorg.GetAsVector();
                Circle circle = new Circle(center+tVec1, new Vector3d(0.0, 0.0, 1.0),p[3]);
                Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
                //开始事务处理,也就是往CAD中加入东西
                Transaction trans = CAD.CurrentTransactionManager.StartTransaction();
                //获得AutoCAD块表,AutoCAD将加入到图形中的对象的信息都放在这个表中
                BlockTable bt = (BlockTable)CAD.CurrentTransactionManager.GetObject(db.BlockTableId, OpenMode.ForRead, false);
                //获得块表记录
                BlockTableRecord btr = (BlockTableRecord)
                CAD.CurrentTransactionManager.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
                //向块表记录加入圆的相关信息
                entId = btr.AppendEntity(circle);
                //向AutoCAD加入圆
                CAD.CurrentTransactionManager.AddNewlyCreatedDBObject(circle, true);
                trans.Commit();
            }
            return entId;
        }
回复

使用道具 举报

0

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
4
发表于 2011-11-5 14:42:00 | 显示全部楼层
顶。。。求高人指点
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 17:29 , Processed in 0.442506 second(s), 67 queries .

© 2020-2025 乐筑天下

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