Dies ist mein Code, der einen bestimmten Block in meiner DWG-Datei nach dem eingegebenen Namen auswählt. Aber ich möchte ganze Seite auswählen und nur Tabelle eines bestimmten Blocks. Und auch die Überschrift Teil gibt mir auch falsche Informationen Ich habe ein Attribut vier, aber es druckt nur eine auf der Überschrift Teil.Bitte schlagen Sie die Lösung vor.Block mit Mausklick auswählen statt Namen eingeben
namespace TableCreation
{
public class Commands
{
// Set up some formatting constants
// for the table
private const double colWidth = 15.0;
private const double rowHeight = 3.0;
private const double textHeight = 1.0;
private const CellAlignment cellAlign =
CellAlignment.MiddleCenter;
// Helper function to set text height
// and alignment of specific cells,
// as well as inserting the text
static public void SetCellText(Table tb, int row, int col, string value)
{
tb.SetAlignment(row, col, cellAlign);
tb.SetTextHeight(row, col, textHeight);
tb.SetTextString(row, col, value);
}
[CommandMethod("BAT")]
static public void BlockAttributeTable()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptStringOptions opt = new PromptStringOptions("\nEnter name of block to list: ");
PromptResult pr = ed.GetString(opts);
if (pr.Status == PromptStatus.OK)
{
string blockToFind = pr.StringResult.ToUpper();
Transaction tr = doc.TransactionManager.StartTransaction();
using (tr)
{
// Let's check the block exists
BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
if (!bt.Has(blockToFind))
{
ed.WriteMessage("\nBlock " + blockToFind + " does not exist.");
}
else
{
// And go through looking for
// attribute definitions
StringCollection colNames = new StringCollection();
BlockTableRecord bd = (BlockTableRecord)tr.GetObject(bt[blockToFind], OpenMode.ForRead);
foreach (ObjectId adId in bd)
{
DBObject adObj = tr.GetObject(adId, OpenMode.ForRead);
// For each attribute definition we find...
AttributeDefinition ad = adObj as AttributeDefinition;
if (ad != null)
{
// ... we add its name to the list
colNames.Add(ad.Tag);
}
}
if (colNames.Count == 0)
{
ed.WriteMessage("\nThe block " + blockToFind + " contains no attribute definitions.");
}
else
{
// Ask the user for the insertion point
// and then create the table
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);
//Point3d startPoint1 = startPoint.Subtract();
Vector3d disp = new Vector3d(0.0, -2.0 * db.Textsize, 0.0);
Vector3d disp2 = new Vector3d(0.0, -2.0 * db.Textsize, 0.0);
if (ppr.Status == PromptStatus.OK)
{
Table tb = new Table();
tb.TableStyle = db.Tablestyle;
tb.NumRows = 1;
tb.NumColumns = colNames.Count;
tb.SetRowHeight(rowHeight);
tb.SetColumnWidth(colWidth);
tb.Position = startPoint;
// Let's add our column headings
for (int i = 0; i < colNames.Count; i++)
{
SetCellText(tb, 0, i, colNames[i]);
}
// Now let's search for instances of
// our block in the modelspace
BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.PaperSpace], OpenMode.ForRead);
int rowNum = 1;
foreach (ObjectId objId in ms)
{
DBObject obj = tr.GetObject(objId, OpenMode.ForRead);
BlockReference br = obj as BlockReference;
if (br != null)
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(br.BlockTableRecord, OpenMode.ForRead);
using (btr)
{
if (btr.Name.ToUpper() == blockToFind)
{
// We have found one of our blocks,
// so add a row for it in the table
tb.InsertRows(rowNum, rowHeight, 1);
// Assume that the attribute refs
// follow the same order as the
// attribute defs in the block
int attNum = 0;
foreach (ObjectId arId in br.AttributeCollection)
{
DBObject arObj = tr.GetObject(arId, OpenMode.ForRead);
AttributeReference ar = arObj as AttributeReference;
if (ar != null)
{
// Embed or link the values
string strCell;
//if (embed)
//{
strCell = ar.TextString;
//}
//else
//{
string strArId = arId.ToString();
strArId = strArId.Trim(new char[] { '(', ')' });
SetCellText(tb, rowNum, attNum, strCell);
ed.WriteMessage(strCell);
}
attNum++;
}
rowNum++;
}
}
}
}
tb.GenerateLayout();
ms.UpgradeOpen();
ms.AppendEntity(tb);
tr.AddNewlyCreatedDBObject(tb, true);
tr.Commit();
}
}
}
}
}
}
}
}
Es gibt mir Ausnahme „Einstellen von Nachrichten Ausnahme ablehnen“ – jackson
Verwenden SetRejectMessage ersten – jackson
noch einen fatalen Fehler geben können Sie es in meiner ursprünglichen Lösung olz bearbeiten und an mich zurück . – jackson