2016-08-04 9 views
1

これはユーザー選択ごとにブロックを選択し、mtextを使用してブロック内の属性を印刷するコードですが、mtextはここで動作しません。前もって感謝します。ブロックの属性がmtext経由で印刷されない

[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

投稿をコードすることが可能と閉じたとして は、私はテキストが –

+0

私のDWGファイルに正確に何をして「正常に動作していない」であることを印刷することを試みましたか? 'MText'はクラッシュを引き起こしているのですか、それともエディタに表示されていませんか?あなたが望む助けを得るためには、もっと正確にする必要があります。 –

+0

Mtextが表示されない –

答えて

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

私は1つのdwgファイルを持っていますその名前は534-W1A-R1.dwg私はdtgファイルにmtextを使ってW1A-R1だけを印刷したい –

関連する問題