插入表生成?
好吧。我想[从当前数据库]生成一个数量插入表,我试图找出关闭autocad的原因,但我做不到...无论如何请看看下面的代码,希望别人的眼睛比我的好....让我知道代码在哪里失败...
提前感谢您!
我正在使用AcDbTable类。
static int TableQuantity() {
AcDbTable *pTable = NULL;
pTable = new AcDbTable();
if (pTable->isWriteEnabled()) {
pTable->insertColumns(0,10.0);
pTable->insertColumns(1,10.0);
pTable->insertColumns(2,10.0);
pTable->generateLayout();
//pTable->insertRows(1,10.0);
////pTable->setNumColumns(3);
////pTable->setNumRows(1);
////pTable->generateLayout();
// title
pTable->setTextString(0,0,"Block Quantity");
pTable->setAlignment(0,0,AcDb::kMiddleCenter);
pTable->setTextHeight(0,0,1.65);
// headers
pTable->insertRows(1,10.0);
pTable->generateLayout();
pTable->setTextString(1,0,"Preview");
pTable->setAlignment(1,0,AcDb::kMiddleCenter);
pTable->setTextHeight(1,0,1.65);
pTable->setTextString(1,1,"Name");
pTable->setAlignment(1,1,AcDb::kMiddleCenter);
pTable->setTextHeight(1,1,1.65);
pTable->setTextString(1,2,"Number");
pTable->setAlignment(1,2,AcDb::kMiddleCenter);
pTable->setTextHeight(1,2,1.65);
//pTable->generateLayout();
AcDbBlockTablePointer pBlockTable(CURDB(), AcDb::kForRead);
EOK(pBlockTable.openStatus());
AcDbBlockTableIterator *pBTIterator;
Acad::ErrorStatus es = pBlockTable->newIterator(pBTIterator, true, true);
if (!EOKM(es))
return false;
for (; !pBTIterator->done(); pBTIterator->step()) {
AcDbObjectId BTRId;
es = pBTIterator->getRecordId(BTRId);
if (!EOKM(es)) {
delete pBTIterator;
return false;
}
AcDbBlockTableRecordPointer pBlockTableRecord(BTRId, AcDb::kForRead);
EOK(pBlockTableRecord.openStatus());
// falta filtro para estos bloques "A$C#???????"
// los bloques anidados llevan "|"
if (// no anonymous blocks
pBlockTableRecord->isAnonymous() ||
// no xref's
pBlockTableRecord->isFromExternalReference() ||
// no overlaid xref's
pBlockTableRecord->isFromOverlayReference() ||
// no block layouts *MODEL_SPACE, *PAPER_SPACE...
pBlockTableRecord->isLayout()) {
continue;
}
AcDbBlockTableRecordIterator *pBTRIterator = NULL;
es = pBlockTableRecord->newIterator(pBTRIterator);
if (!EOKM(es))
continue;
const TCHAR *bName;
es = pBlockTableRecord->getName(bName);
if (!EOKM(es)) {
delete pBTIterator;
return false;
}
char text ;
AcDbObjectIdArray ids;
if (pBlockTableRecord->getBlockReferenceIds(ids) == Acad::eOk) {
//acutPrintf("\nBlock name %s", bName);
//acutPrintf("\nCount %d", ids.length());
int cnt;
cnt = ids.length();
itoa(cnt,text,10);
}
pTable->insertRows(1,10.0);
pTable->generateLayout();
pTable->setBlockTableRecordId(pTable->numRows(),0,BTRId,true);
pTable->setAlignment(pTable->numRows(),0,AcDb::kMiddleCenter);
pTable->setTextString(pTable->numRows(),1,bName);
pTable->setAlignment(pTable->numRows(),1,AcDb::kMiddleCenter);
pTable->setTextHeight(pTable->numRows(),1,1.65);
pTable->setTextString(pTable->numRows(),2,text);
pTable->setAlignment(pTable->numRows(),2,AcDb::kMiddleCenter);
pTable->setTextHeight(pTable->numRows(),2,1.65);
//pTable->generateLayout();
}
delete pBTIterator;
AcDbObjectId curSpaceId=CURDB()->currentSpaceId();
AcDbBlockTableRecord *pBlkRec = NULL;
if (acdbOpenObject(pBlkRec, curSpaceId, AcDb::kForWrite)==Acad::eOk) {
pBlkRec->appendAcDbEntity(pTable);
pBlkRec->close();
pTable->close();
}
}
}
**** Hidden Message *****
谢谢Mick,
我现在正在查看唯一可用的样本SDK附带的样本]...奇怪的是网上没有另一个...至少在我的谷歌搜索和adesk论坛上是这样....
我会回来的.... 到目前为止,发生的是我在发布的原始代码上的序列,最新的测试它没有关闭autocad。
用代码的话来说,它必须遵循以下内容:
AcDbTable *pTable = NULL;
pTable = new AcDbTable();
// 2 rows - title and headers
pTable->insertRows(0,10.0);
// 3 columns
pTable->insertColumns(0,10.0,2);
pTable->setTextString(0,0,"TITLE");
// merge the first row for the title
pTable->mergeCells(0,0,0,pTable->numColumns() - 1);
然后,从这里我们可以扫描块并一次将它们添加到表中一行[嗯,听起来很简单,我需要继续进行测试并自己找出答案...]
玩得开心,
Luis。 更新...
我正在运行该功能.....相当不错!!!
如果我们首先创建基本表,然后重新打开对象并将数据填充到表中,就可以了。
现在,在将表追加到数据库之前,我将尝试填充该表...
是的,查克,你是对的(一如既往)。我只记得在某个地方读到它们必须附加,否则它会失败。自从我创建并删除它们以来。它可能失败的原因是未能删除内存区域/poly的(?)。我必须把它挖出来再看一遍。
不过,我想说的是,有时内存中的东西和数据库中的东西可能无法很好地结合在一起(?)。
我试图在[填充表]之前完成所有操作......并且根本不起作用,所以我最终首先完成表骨架,然后读取所有插入并将它们传递到表中,现在没有任何问题,并且用户没有任何线索,因为它在一眨眼的功夫就完成了这些......[所有表的东西都是根据帮助文档在内存中完成的btw]
对不起,米克。 我并不是想分散你对所表达的观点的注意力。 只是你举出的这个例子恰好是我最近真正做过的事情,所以它在我脑海中记忆犹新(你知道我无法抗拒一个机会从我的嘴里射掉)。
至于桌子,恐怕我一点头绪都没有。 2000i没有它们。 有时我担心我的技能会过时,因为我们可能永远不会升级。 我被搞砸了。
没问题,我的朋友。
当你是对的,无需道歉查克。
就被抛在后面而言,在更高版本中需要对数据库执行的大多数操作几乎相同,最大的区别在于MFC和新的“功能”(如Tables)。
我认为仅仅保持湿巾湿润就能让你超越常规..之后的任何事情都是额外奖励
页:
[1]
2