コード例 #1
0
        /// <summary>
        /// 删除实体的缩放比例
        /// </summary>
        /// <param name="entId">实体的Id</param>
        /// <param name="scaleNames">缩放比例名列表</param>
        public static void RemoveScale(this ObjectId entId, params string[] scaleNames)
        {
            //获取entId指示的实体对象
            DBObject obj = entId.GetObject(OpenMode.ForRead);

            //如果实体对象支持注释缩放
            if (obj.Annotative != AnnotativeStates.NotApplicable)
            {
                //获得对象所有的注释比例
                List <ObjectContext> scales = entId.GetAllScales();
                obj.UpgradeOpen();//切换实体为写的状态
                //获取当前图形的对象比例管理器
                ObjectContextManager ocm = obj.Database.ObjectContextManager;
                //获取当前图形的注释比例列表,名为ACDB_ANNOTATIONSCALES
                ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
                //遍历需要设置的注释比例
                foreach (string scaleName in scaleNames)
                {
                    //获取名为scaleName的注释比例
                    ObjectContext scale = occ.GetContext(scaleName);
                    //若不存在scaleName的注释比例,则结束本次循环
                    if (scale == null)
                    {
                        continue;
                    }
                    //删除名为scaleName的注释比例
                    ObjectContexts.RemoveContext(obj, scale);
                }
                obj.DowngradeOpen();//为了安全将实体切换为读的状态
            }
        }
コード例 #2
0
        /// <summary>
        /// 在AutoCAD图形中插入块参照
        /// </summary>
        /// <param name="spaceId">块参照要加入的模型空间或图纸空间的Id</param>
        /// <param name="layer">块参照要加入的图层名</param>
        /// <param name="blockName">块参照所属的块名</param>
        /// <param name="position">插入点</param>
        /// <param name="scale">缩放比例</param>
        /// <param name="rotateAngle">旋转角度</param>
        /// <returns>返回块参照的Id</returns>
        public static ObjectId InsertBlockReference(this ObjectId spaceId, string layer, string blockName, Point3d position, Scale3d scale, double rotateAngle)
        {
            ObjectId blockRefId;            //存储要插入的块参照的Id
            Database db = spaceId.Database; //获取数据库对象
            //以读的方式打开块表
            BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);

            //如果没有blockName表示的块,则程序返回
            if (!bt.Has(blockName))
            {
                return(ObjectId.Null);
            }
            //以写的方式打开空间(模型空间或图纸空间)
            BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite);
            //创建一个块参照并设置插入点
            BlockReference br = new BlockReference(position, bt[blockName]);

            br.ScaleFactors = scale;        //设置块参照的缩放比例
            br.Layer        = layer;        //设置块参照的层名
            br.Rotation     = rotateAngle;  //设置块参照的旋转角度
            ObjectId btrId = bt[blockName]; //获取块表记录的Id
            //打开块表记录
            BlockTableRecord record = (BlockTableRecord)btrId.GetObject(OpenMode.ForRead);

            //添加可缩放性支持
            if (record.Annotative == AnnotativeStates.True)
            {
                ObjectContextCollection contextCollection = db.ObjectContextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
                ObjectContexts.AddContext(br, contextCollection.GetContext("1:1"));
            }
            blockRefId = space.AppendEntity(br);                     //在空间中加入创建的块参照
            db.TransactionManager.AddNewlyCreatedDBObject(br, true); //通知事务处理加入创建的块参照
            space.DowngradeOpen();                                   //为了安全,将块表状态改为读
            return(blockRefId);                                      //返回添加的块参照的Id
        }
コード例 #3
0
        /// <summary>
        /// 在AutoCAD图形中插入块参照
        /// </summary>
        /// <param name="spaceId">块参照要加入的模型空间或图纸空间的Id</param>
        /// <param name="layer">块参照要加入的图层名</param>
        /// <param name="blockName">块参照所属的块名</param>
        /// <param name="position">插入点</param>
        /// <param name="scale">缩放比例</param>
        /// <param name="rotateAngle">旋转角度</param>
        /// <param name="attNameValues">属性的名称与取值</param>
        /// <returns>返回块参照的Id</returns>
        public static ObjectId InsertBlockReference(this ObjectId spaceId, string layer, string blockName, Point3d position, Scale3d scale, double rotateAngle)
        {
            DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
            ObjectId     blockRefId;
            Database     db = spaceId.Database;
            BlockTable   bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);

            if (!bt.Has(blockName))
            {
                return(ObjectId.Null);
            }
            BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite);
            BlockReference   br    = new BlockReference(position, bt[blockName]);

            br.ScaleFactors = scale;
            br.Layer        = layer;
            br.Rotation     = rotateAngle;
            ObjectId         btrId  = bt[blockName];
            BlockTableRecord record = (BlockTableRecord)btrId.GetObject(OpenMode.ForRead);

            if (record.Annotative == AnnotativeStates.True)
            {
                ObjectContextCollection contextCollection = db.ObjectContextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
                ObjectContexts.AddContext(br, contextCollection.GetContext("1:1"));
            }
            blockRefId = space.AppendEntity(br);
            db.TransactionManager.AddNewlyCreatedDBObject(br, true);
            space.DowngradeOpen();
            docLock.Dispose();
            return(blockRefId);
        }
コード例 #4
0
        /// <summary>
        /// Вставка блока с атрибутами
        /// </summary>
        /// <param name="promptCounter">0 - только вставка, 1 - с поворотом</param>
        /// <param name="tr">Транзакция</param>
        /// <param name="db">База данных чертежа</param>
        /// <param name="ed">Editor</param>
        /// <param name="blkDefId">ObjectId блока</param>
        /// <param name="attributes">Список имен атрибутов</param>
        /// <param name="isAnnotative">Аннотативность блока-исходника</param>
        /// <returns></returns>
        public static ObjectId InsertBlockRef(
            int promptCounter,
            Transaction tr,
            Database db,
            Editor ed,
            ObjectId blkDefId,
            List <string> attributes,
            bool isAnnotative)
        {
            var btr            = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
            var blockReference = new BlockReference(Point3d.Origin, blkDefId);

            if (isAnnotative)
            {
                var ocm = db.ObjectContextManager;
                var occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
                ObjectContexts.AddContext(blockReference, occ.CurrentContext);
            }

            var id = btr.AppendEntity(blockReference);

            tr.AddNewlyCreatedDBObject(blockReference, true);
            var jig = new BlockRefJig(blockReference, AppendAttribToBlock(tr, blockReference, attributes));

            jig.SetPromptCounter(0);
            var res = ed.Drag(jig);

            if (res.Status == PromptStatus.OK)
            {
                if (promptCounter == 1)
                {
                    jig.SetPromptCounter(promptCounter);
                    res = ed.Drag(jig);
                    if (res.Status == PromptStatus.OK)
                    {
                        return(id);
                    }
                }
                else
                {
                    return(id);
                }
            }

            blockReference.Erase();
            return(ObjectId.Null);
        }
コード例 #5
0
        /// <summary>
        /// 为实体添加指定的注释比例
        /// </summary>
        /// <param name="entId">实体的Id</param>
        /// <param name="scaleNames">注释比例名列表</param>
        public static void AttachScale(this ObjectId entId, params string[] scaleNames)
        {
            Database db = entId.Database;
            //获取entId指示的实体对象
            DBObject obj = entId.GetObject(OpenMode.ForRead);

            //如果实体对象支持注释缩放
            if (obj.Annotative != AnnotativeStates.NotApplicable)
            {
                //如果实体为块参照,则需要通过其所属的块表记录来设置可注释缩放
                if (obj is BlockReference)
                {
                    BlockReference br = obj as BlockReference;
                    //打开对应的块表记录
                    BlockTableRecord btr = (BlockTableRecord)br.BlockTableRecord.GetObject(OpenMode.ForWrite);
                    //设置块表记录为可注释缩放
                    btr.Annotative = AnnotativeStates.True;
                }
                //其它可注释缩放的实体,使其可注释缩放
                else if (obj.Annotative == AnnotativeStates.False)
                {
                    obj.Annotative = AnnotativeStates.True;
                }
                obj.UpgradeOpen();//切换实体为写的状态以添加注释比例
                //获取当前图形的对象比例管理器
                ObjectContextManager ocm = db.ObjectContextManager;
                //获取当前图形的注释比例列表,名为ACDB_ANNOTATIONSCALES
                ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
                //遍历需要设置的注释比例
                foreach (string scaleName in scaleNames)
                {
                    //获取名为scaleName的注释比例
                    ObjectContext scale = occ.GetContext(scaleName);
                    //若不存在scaleName的注释比例,则结束本次循环
                    if (scale == null)
                    {
                        continue;
                    }
                    //为实体添加名为scaleName的注释比例
                    ObjectContexts.AddContext(obj, scale);
                }
                obj.DowngradeOpen();//为了安全将实体切换为读的状态
            }
        }
コード例 #6
0
        /// <summary>
        /// 获取实体拥有的所有缩放比例
        /// </summary>
        /// <param name="entId">实体的Id</param>
        /// <returns>返回实体的缩放比例列表</returns>
        public static List <ObjectContext> GetAllScales(this ObjectId entId)
        {
            //声明一个列表对象,用于返回实体所拥有的所有的注释比例
            List <ObjectContext> scales = new List <ObjectContext>();
            DBObject             obj    = entId.GetObject(OpenMode.ForRead);

            if (obj.Annotative != AnnotativeStates.NotApplicable)
            {
                ObjectContextManager    ocm = obj.Database.ObjectContextManager;
                ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
                //遍历注释比例列表
                foreach (ObjectContext oc in occ)
                {
                    //如果实体拥有此注释比例
                    if (ObjectContexts.HasContext(obj, oc))
                    {
                        scales.Add(oc);//将此注释比例添加到返回列表中
                    }
                }
            }
            return(scales);//返回实体所拥有的所有的注释比例
        }