MickD 发表于 2006-4-20 22:03:08

插入表生成?

好吧。
我想[从当前数据库]生成一个数量插入表,我试图找出关闭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 *****

MickD 发表于 2006-4-20 22:28:04


谢谢Mick,
我现在正在查看唯一可用的样本SDK附带的样本]...奇怪的是网上没有另一个...至少在我的谷歌搜索和adesk论坛上是这样....
我会回来的....

MickD 发表于 2006-4-21 11:21:09

到目前为止,发生的是我在发布的原始代码上的序列,最新的测试它没有关闭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。

MickD 发表于 2006-4-21 14:32:50

更新...
我正在运行该功能.....相当不错!!!
如果我们首先创建基本表,然后重新打开对象并将数据填充到表中,就可以了。
现在,在将表追加到数据库之前,我将尝试填充该表...

Kerry 发表于 2006-4-21 16:00:31


是的,查克,你是对的(一如既往)。我只记得在某个地方读到它们必须附加,否则它会失败。自从我创建并删除它们以来。它可能失败的原因是未能删除内存区域/poly的(?)。我必须把它挖出来再看一遍。
不过,我想说的是,有时内存中的东西和数据库中的东西可能无法很好地结合在一起(?)。

Kerry 发表于 2006-4-21 17:10:07

我试图在[填充表]之前完成所有操作......并且根本不起作用,所以我最终首先完成表骨架,然后读取所有插入并将它们传递到表中,现在没有任何问题,并且用户没有任何线索,因为它在一眨眼的功夫就完成了这些......[所有表的东西都是根据帮助文档在内存中完成的btw]

MickD 发表于 2006-4-21 20:06:53

对不起,米克。 我并不是想分散你对所表达的观点的注意力。 只是你举出的这个例子恰好是我最近真正做过的事情,所以它在我脑海中记忆犹新(你知道我无法抗拒一个机会从我的嘴里射掉)。
至于桌子,恐怕我一点头绪都没有。 2000i没有它们。 有时我担心我的技能会过时,因为我们可能永远不会升级。 我被搞砸了。

MickD 发表于 2006-4-21 20:10:51


没问题,我的朋友。

MickD 发表于 2006-4-21 20:18:07

当你是对的,无需道歉查克。
就被抛在后面而言,在更高版本中需要对数据库执行的大多数操作几乎相同,最大的区别在于MFC和新的“功能”(如Tables)。

MickD 发表于 2006-4-21 20:24:44


我认为仅仅保持湿巾湿润就能让你超越常规..之后的任何事情都是额外奖励
页: [1] 2
查看完整版本: 插入表生成?