首页 > 代码库 > CAD.NET调整属性块中文字宽度

CAD.NET调整属性块中文字宽度

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

[assembly: CommandClass(typeof(AttributeWidthFactor.MyCommands))]

namespace AttributeWidthFactor
{
    public class MyCommands
    {
        [CommandMethod("AttWidth")]
        public static void SetAttrWidthFactor()
        {
            Document dwg = Application.DocumentManager.MdiActiveDocument;
            Editor ed = dwg.Editor;

            //Pick an attributereference in a block
            PromptNestedEntityOptions opt = new 
                PromptNestedEntityOptions("\nPick an attribute:");
            PromptNestedEntityResult res = ed.GetNestedEntity(opt);

            if (res.Status == PromptStatus.OK)
            {
                if (res.ObjectId.ObjectClass.DxfName.ToUpper() == "ATTRIB")
                {
                    //Ask user to pick a distance as desired width for 
                    //the attribute to fit in. Based on the block, the width 
                    //could be a known value
                    PromptPointOptions popt = new 
                        PromptPointOptions("\nPick width base point:");
                    PromptPointResult pres = ed.GetPoint(popt);
                    if (pres.Status != PromptStatus.OK) return;
                    Point3d basePt = pres.Value;

                    PromptDistanceOptions dopt = 
                        new PromptDistanceOptions("\nPick width: ");
                    dopt.UseBasePoint = true;
                    dopt.BasePoint = basePt;

                    PromptDoubleResult dres = ed.GetDistance(dopt);
                    if (dres.Status != PromptStatus.OK) return;

                    //This is the width we want to fit the attribute text‘s width
                    double w = dres.Value;

                    using (Transaction tran = 
                        dwg.TransactionManager.StartTransaction())
                    {
                        AttributeReference att = (AttributeReference)tran.GetObject(
                            res.ObjectId, OpenMode.ForWrite);

                        //Get attribute‘s width, assuming it is placed horizontally
                        double aw = Math.Abs(att.GeometricExtents.MaxPoint.X 
                            - att.GeometricExtents.MinPoint.X);

                        //This is the WidthFactor
                        double factor = w / aw;
                        att.WidthFactor = factor;

                        tran.Commit();
                    }
                }
                else
                {
                    Application.ShowAlertDialog("Not an attribute!");
                }
            }
        }
    }
}