2016-08-04 39 views
1

这是我的代码,它根据用户选择选择块并使用多行文字在该块中打印属性,但多行文字在此处不起作用。此外,我还需要具有相同编号的重复属性。提前致谢。不通过多行文字打印块的属性

[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) 
       { 

//这部分不能正常工作

    MText mtext = new MText(); 

        //mtext.SetDatabaseDefaults(); 

        mtext.Width = 2; 

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

        AttributeReference attRef = 

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

    string str =("\n" + attRef.TextString); 

        mtext.Contents = "\n" + str; 

        ed.WriteMessage(str); 

        btr.AppendEntity(mtext); 

        tr.AddNewlyCreatedDBObject(mtext, true); 
       } 
      } 
      tr.Commit(); 
     } 
     catch (Autodesk.AutoCAD.Runtime.Exception ex) 
     { 
      ed.WriteMessage(("Exception: " + ex.Message)); 
     } 
     finally 
     { 
      tr.Dispose(); 
     } 
    } 
} 

}

+0

我想打印我的DWG文件 –

+0

到底是什么文本的代号为“不正常”? “MText”是否会导致崩溃或在编辑器中未显示?为了得到你想要的帮助,你必须更加精确一点。 – 2016-08-04 12:53:25

+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)); 
      } 
     } 
    } 
+0

其工作非常感谢gileCAD –

+0

我有一个dwg文件,它的名字是534-W1A-R1.dwg我只想在我的dwg文件上使用mtext打印W1A-R1 –