块中的属性不通过mtext打印

时间:2016-08-04 06:19:15

标签: c# autocad

这是我的代码,根据用户选择选择块,并使用mtext打印该块中的attrbutes但是mtext在这里不起作用。而且我也想要重复属性相同的no ..提前感谢。

library(data.table)
m <- data.frame(m)
microbenchmark(fun4(m,x), times = 1000)

# Unit: microseconds
#       expr     min       lq     mean median      uq      max neval
# fun4(m, x) 836.026 887.6555 985.8596 920.49 968.269 9025.546  1000

//此部分无法正常工作

    [CommandMethod("NALATT")]
    public void ListAttributes()
    {
        Document acDoc = Application.DocumentManager.MdiActiveDocument;
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
        Database db =HostApplicationServices.WorkingDatabase;
        Transaction tr = db.TransactionManager.StartTransaction();

        // Start the transaction
        try
        {
            // Build a filter list so that only
            // block references are selected
            TypedValue[] filList = new TypedValue[1] {new TypedValue((int)DxfCode.Start, "INSERT")};
            SelectionFilter filter = new SelectionFilter(filList);

            PromptSelectionOptions opts = new PromptSelectionOptions();

            opts.MessageForAdding = "Select block references: ";

            PromptSelectionResult res = ed.GetSelection(opts, filter);

            // Do nothing if selection is unsuccessful

            if (res.Status != PromptStatus.OK)

                return;

            SelectionSet selSet = res.Value;

            ObjectId[] idArray = selSet.GetObjectIds();

            PromptPointResult ppr;

            PromptPointOptions ppo = new PromptPointOptions("");

            //get the coordinates from user
            ppo.Message = "\n Select the place for print output:";

            ppr = acDoc.Editor.GetPoint(ppo);

            Point3d ptstart = ppr.Value;

            ppo.UseBasePoint = true;

            ppo.BasePoint = ptstart;

            if (ppr.Status == PromptStatus.Cancel) return;

            double x = ptstart.X;

            double y = ptstart.Y;

            double z = 1;

            foreach (ObjectId blkId in idArray)

            {
                BlockReference blkRef =(BlockReference)tr.GetObject(blkId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(blkRef.BlockTableRecord, OpenMode.ForWrite );

                ed.WriteMessage("\nBlock: " + btr.Name);

                btr.Dispose();

                AttributeCollection attCol = blkRef.AttributeCollection;

                foreach (ObjectId attId in attCol)
                {

(AttributeReference)tr.GetObject(attId,OpenMode.ForRead);

                    MText mtext = new MText();

                    //mtext.SetDatabaseDefaults();

                    mtext.Width = 2;

                    mtext.Location = new Point3d(x, y = y - 1, z);

                    AttributeReference attRef =

}

1 个答案:

答案 0 :(得分:0)

我不确定你究竟想要做什么,但下面的代码“打印”了当前空间中所选块的属性值。 我试图尽可能地关闭你发布的代码

    [CommandMethod("NALATT")]
    public void ListAttributes()
    {
        Document acDoc = Application.DocumentManager.MdiActiveDocument;
        Editor ed = acDoc.Editor;
        Database db = acDoc.Database;
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
            // Start the transaction
            try
            {
                // Build a filter list so that only
                // block references with attributes are selected
                TypedValue[] filList = new TypedValue[2] { new TypedValue((int)DxfCode.Start, "INSERT"), new TypedValue((int)DxfCode.HasSubentities, 1) };
                SelectionFilter filter = new SelectionFilter(filList);
                PromptSelectionOptions opts = new PromptSelectionOptions();
                opts.MessageForAdding = "Select block references: ";
                PromptSelectionResult res = ed.GetSelection(opts, filter);
                // Do nothing if selection is unsuccessful
                if (res.Status != PromptStatus.OK)
                    return;
                SelectionSet selSet = res.Value;
                ObjectId[] idArray = selSet.GetObjectIds();

                PromptPointResult ppr;
                PromptPointOptions ppo = new PromptPointOptions("");
                ppo.Message = "\n Select the place for print output:";
                //get the coordinates from user
                ppr = ed.GetPoint(ppo);
                if (ppr.Status != PromptStatus.OK)
                    return;
                Point3d startPoint = ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem);
                Vector3d disp = new Vector3d(0.0, -2.0 * db.Textsize, 0.0);

                //a HashSet to store printed strings to avoid duplicated values
                HashSet<string> attValues = new HashSet<string>();

                foreach (ObjectId blkId in idArray)
                {
                    BlockReference blkRef = (BlockReference)tr.GetObject(blkId, OpenMode.ForRead);
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(blkRef.BlockTableRecord, OpenMode.ForWrite);
                    ed.WriteMessage("\nBlock: " + btr.Name);

                    // get the current space (where to print the attributes values)
                    var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

                    AttributeCollection attCol = blkRef.AttributeCollection;
                    foreach (ObjectId attId in attCol)
                    {
                        AttributeReference attRef = (AttributeReference)tr.GetObject(attId, OpenMode.ForRead);
                        string str = (attRef.TextString);
                        ed.WriteMessage("\n" + str);
                        if (attValues.Contains(str))
                            continue;

                        // add the mtext to current space
                        MText mtext = new MText();
                        mtext.Width = 2;
                        mtext.Location = startPoint;
                        mtext.Contents = str;
                        curSpace.AppendEntity(mtext);
                        tr.AddNewlyCreatedDBObject(mtext, true);
                        db.TransactionManager.QueueForGraphicsFlush();
                        // add the string to the HashSet
                        attValues.Add(str);
                        // move the insertion point
                        startPoint += disp;
                    }
                }
                tr.Commit();
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                ed.WriteMessage(("Exception: " + ex.Message));
            }
        }
    }