CAD二开---框选文字批量对齐

一.思路

          DBText除了有Position位置属性外,还有对齐属性AlignmentPosition,AlignmentPosition属性有以下可选择:

                           

 

二.代码     

           通用类:    

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.Private.Windows.ToolBars;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OperationCurrentView.CommLib
{
    public class CommLib
    {
        public Document m_doc;
        public Database m_db;
        public Editor m_editor;

        public CommLib()
        {
            m_doc = Application.DocumentManager.MdiActiveDocument;
            m_db = m_doc.Database;
            m_editor = m_doc.Editor;
        }

        /// <summary>
        /// 显示字符串
        /// </summary>
        /// <param name="str"></param>
        public void CADDisplay(string str)
        {
            m_editor.WriteMessage(str);
        }
        /// <summary>
        /// 选择一个点
        /// </summary>
        /// <param name="optMsg"></param>
        /// <returns></returns>
        public Point3d SelectPoint(string optMsg)
        {
            PromptPointResult promptPtRes;
            PromptPointOptions promptPtOps = new PromptPointOptions("");
            //提示起点
            promptPtOps.Message = optMsg;
            promptPtRes = m_editor.GetPoint(promptPtOps);
            Point3d startPt = promptPtRes.Value;

            return startPt;
        }
        /// <summary>
        /// 获取选择集
        /// </summary>
        /// <param name="selectStr"></param>
        /// <param name="ptColl"></param>
        /// <param name="acTypeVal"></param>
        /// <returns></returns>
        public SelectionSet GetSelectionSet(string selectStr, Point3dCollection ptColl, TypedValue[] acTypeVal)
        {
            SelectionFilter filter = null;
            if (acTypeVal != null)
                filter = new SelectionFilter(acTypeVal);     //过滤原则
            //请求在图形区域内选择对象
            PromptSelectionResult promptSelectRes;
            if (selectStr == "GetSelection")
                promptSelectRes = m_editor.GetSelection(filter);
            else if (selectStr == "SelectAll")
            {
                promptSelectRes = m_editor.SelectAll(filter);    //获取空间内未锁定和冻结的对象
            }
            else if (selectStr == "SelectCrossingPolygon")
            {
                //选择由给定点定义的多边形内的所有对象以及与多边形相交的对象
                promptSelectRes = m_editor.SelectCrossingPolygon(ptColl, filter);
            }
            else if (selectStr == "SelectCrossingWindow")
            {
                //选择由两个点定义的窗口内的对象及与窗口相交的对象
                promptSelectRes = m_editor.SelectCrossingWindow(ptColl[0], ptColl[1], filter);
            }
            else if (selectStr == "SelectWindow")
            {
                //选择完全框入由两个点定义的矩形内的所有对象
                promptSelectRes = m_editor.SelectWindow(ptColl[0], ptColl[1], filter);
            }
            else if (selectStr == "SelectWindowPolygon")
            {
                //选择完全框入由点定义的多边形内的对象
                promptSelectRes = m_editor.SelectWindowPolygon(ptColl, filter);
            }
            else if (selectStr == "SelectFence")
            {
                //选择与选择围栏相交的所有对象,围栏选择与多边形选择类型.
                promptSelectRes = m_editor.SelectFence(ptColl, filter);
            }
            else { return null; }

            if (promptSelectRes.Status == PromptStatus.OK)
            {
                SelectionSet selectSet = promptSelectRes.Value;
                CADDisplay($"选择的对象数量:{selectSet.Count}\n");
                return selectSet;
            }
            else
            {
                CADDisplay("选择的对象数量为0");
                return null;
            }


        }

    }
}

       操作代码:

                     

        //批量对齐文字
        [CommandMethod("AligmentText")]
        public void AligmentTxt()
        {
            CommLib.CommLib commUtil = new CommLib.CommLib();
            commUtil.CADDisplay("\n这是文字批量对齐");
            Point3d pt = commUtil.SelectPoint("\n>>>请选择一个基点");

            TypedValue[] typedVals = new TypedValue[1];
            typedVals.SetValue(new TypedValue(0, "Text"), 0);

            //获取选择集
            SelectionSet selectSet = commUtil.GetSelectionSet("GetSelection", null, typedVals);

            Database db = commUtil.m_doc.Database;
            if (selectSet != null)
            {
                foreach(SelectedObject item in selectSet)
                {
                    if (item != null)
                    {
                        using(Transaction trans = db.TransactionManager.StartTransaction())
                        {
                            DBText txt = trans.GetObject(item.ObjectId, OpenMode.ForWrite) as DBText;
                            txt.HorizontalMode = TextHorizontalMode.TextRight;
                            if (txt.HorizontalMode != TextHorizontalMode.TextLeft)
                            {
                                Point3d alipt = txt.AlignmentPoint;   //值为零   AlignmentPoint对齐点
                                commUtil.CADDisplay($"\n{alipt.ToString()}");
                                Point3d posPt = txt.Position;
                                txt.AlignmentPoint = new Point3d(pt.X, posPt.Y, 0);
                            }
                            else
                            {
                                Point3d posPt = txt.Position;
                                txt.Position = new Point3d(pt.X, posPt.Y, 0);
                            }
                            trans.Commit();
                        }
                    }
                }
            }
        }

三.总结

           程序思路:

                       1、 选择一个基准对齐点(选择点)

                       2、 框选文字(选择集)

                       3、 遍历每个文字,更改其对齐方式为 左对齐  对齐点的X 与基准点保持一致

                       4、 完成程序

           根据文档,在Left 对齐方式下,不需要AlignmengtPoint,这个时候给AlignmengtPoint赋值无效会报错

                                                    

 

 

    

posted @ 2020-06-19 14:08  小王子的博客  阅读(1006)  评论(0编辑  收藏  举报