这是我的代码,它在所选块中获取属性,并在dwg文件中打印其表。
但问题是我的标题是attribute.tag,其内容是attribute.textstring
,在我的表中,标题不会打印,而是记录从头开始。请建议我同样的解决方案。
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(opt);
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);
ed.WriteMessage("\n" + 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 < 5; i++)
{
SetCellText(tb, 0, i, colNames[i]);
//ed.WriteMessage("\n" + 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, 2);
// 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)
{
string strCell;
strCell = ar.TextString;
string strArId = arId.ToString();
strArId = strArId.Trim(new char[] { '(', ')' });
SetCellText(tb, rowNum, attNum, strCell);
ed.WriteMessage("\n" + ar.Tag);
}
attNum++;
}
rowNum++;
}
}
}
}
tb.GenerateLayout();
ms.UpgradeOpen();
ms.AppendEntity(tb);
tr.AddNewlyCreatedDBObject(tb, true);
tr.Commit();
}
}
}
}
}
}
}
}
答案 0 :(得分:0)
这是由于当前的表格样式(db.Tablestyle),其中第一行是&#39;标题&#39;行(合并的单元格)。 您可以使用第一行显示块名称,使用第二行作为标题并开始填充第三行中的值。
extension CustomCollectionViewController: CustomCollectionViewDelegateLayout {
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, widthForItemAtIndexPath indexPath: NSIndexPath) -> CGFloat {
//from indexPath.section and indexPath.item identify double width item
if sirano == 2 && satimdurum == 0 {
return regularWidth * 2
}
return regularWidth
}
}