![]() |
_variant_t的使用&VC
【隐藏帖】
|
回复: _variant_t的使用&VC
铁心,
你好,你的问题没法调试,很难说清楚的.你先了解一下_variant_这个类型怎么用?!或在opendwg官方论坛上去问.还是不行的话,如果你方便,就把相关的部分源程序发给我吗?我帮你调试一下看看. 对了,你用的哪个版本的opendwg? Yogy |
回复: _variant_t的使用&VC
Yogy,
你回复的好快啊!呵呵............ 我现在用的就是免费的那个版本,DWGdirectX 1.12.zip 其实我就是在那个VC例子改的,没有什么不方便的,另外我在那论坛上问了,还没人回答我! 铁心 |
回复: _variant_t的使用&VC
R:
Hi, Welcome. 1)AutoCAD中大多数的文字是AcadMText类型 2)查询子接口一般用 pEnt->QueryInterface(IID_IAcadMText,(void **)&pText); 3) 取VARIANT 中的数组参数时,Point用完后,记得调用SafeArrayUnaccessData(Point.parray); 4) 多去OpenDWG上官方论坛问问,先混个脸熟. 5)遇到取点坐标值时,double类型不行,换float类型试试. 6)你要查函数说明,建议你还是看Arx的帮助文档. 7)你给我的那些帮助看起来都不全,下个Arx开发包,里面的帮助要更完整些. 8)你要是打算用VC6.0, 下载的Arx开发包的版本不要太高,Arx2002~Arx2004就差不多了(记不太得了),再高一点的Arx版本下的例程你可能用VC6.0会打不开了. PS: 你的代码我修改之后,已经通过编译. bool CSampleWindow::FillTreeWithBlockEntities(HTREEITEM hParent, IAcadBlock *pBlock) { CComPtr<IUnknown> pUnk; CComQIPtr<IEnumVARIANT, &IID_IEnumVARIANT> pNewEnum; CComQIPtr<IAcadEntity, &IID_IAcadEntity> pEnt; CComQIPtr<IAcadMText, &IID_IAcadText> pText;///我加的 if (SUCCEEDED(pBlock->get__NewEnum(&pUnk)) && pUnk != NULL) { VARIANT varItem; VariantInit(&varItem); pNewEnum = pUnk; while (pNewEnum->Next(1, &varItem, NULL) == S_OK) { CComBSTR bName; ///////////////////// CComBSTR bstring; //////////////////////////////// assert(VT_DISPATCH == varItem.vt); pEnt = varItem.pdispVal; // VariantClear(&varItem); pEnt->get_ObjectName(&bName); /////////////////////////////////// if(_strcmpi("AcDbMText",(LPCSTR)_bstr_t(bName,false))==0) { if (!pEnt) return false; try { pEnt->QueryInterface(IID_IAcadMText,(void **)&pText); } catch(...) { } if (!pText) return false; pText->get_TextString(&bstring); _variant_t Point; VariantInit(&Point); pText->get_InsertionPoint(&Point); //IDispatch *pPnt = NULL; double *pPnt = NULL; long ind = 0; // SafeArrayGetElement(Point.parray, &ind, (void*)&pPnt); SafeArrayAccessData (Point.parray, (void**)&pPnt); SafeArrayUnaccessData(Point.parray); // release Point if no use VariantClear(&Point); //InsertItem(m_wndView, (LPCTSTR)_bstr_t(bstring), 0, 1, 111, hParent, TVI_LAST); } } } return true; } |
回复: _variant_t的使用&VC
Q:
你好! 我又来烦你了,呵呵.............你的那代码我放进去了,编译是没问题,但是运行就出错,真的很郁闷......另外我想讲下,就是我现在已经确定所有的标题栏文字是AcDbText,其实if(_strcmpi("AcDbText",(LPCSTR)_bstr_t(bName,false))==0)这句话不就把非AcDbText实体排除了么?还有必要try,catch么?我下了Arx开发包,是2000版本的,但是里面的帮助和这个好象没什么大的关系啊,要是能有这个DWGdirectX的帮助文挡就好了, 你看下我给你的那程序的代码: if(_strcmpi("AcDbText",(LPCSTR)_bstr_t(bName,false))==0) { pText = varItem.pdispVal; VariantClear(&varItem); pText->get_TextString(&bstring); InsertItem(m_wndView, (LPCTSTR)_bstr_t(bstring), 0, 1, 111, hParent, TVI_LAST); } 就是这几句话把所有的文字信息提出来了,但是提出来的信息太多了,我只要知道设计者是谁,审核者是谁等这些信息,我就是想通过坐标点过滤了一部分信息,我发一张DWG图纸给你看看,另外还有两个图片. 对不起,我有疑问就提出来了,有什么不对的地方请多多包涵!!! |
回复: _variant_t的使用&VC
R:
1)你若想知道get_TextString函数的所带的参数,你可在Arx中search,Arx和OpenDWG中的定义都一致. 2)运行报的错,你可点”ignore”,程序还是可以接着往下运行的,具体什么原因导致的还待查查. 3)你在得到文本的名字,做个”设计者”字符串比较呀,不过,遇到不同语种,不知你想过么? 4)若每张图的大小都不一样,不知你打算怎么靠插入点来过滤信息? 5)你的图纸若是都有规律可循,倒是还简单点 |
回复: _variant_t的使用&VC
Q:
我点了忽略还是不行的哦,还有你说的语种那没问题,因为只做中文的,呵呵....所有的标题栏都是按照国标规定的,例如我得到"设计"这个字符串的话,设计者的名字不就肯定在它后面么?它们的Y坐标是一样的,X坐标推后一点,在一个区间范围内的,超过范围那就肯定不对了.这样不就过滤信息了么?对这样想法我认为没问题,关键就是实施起来就是很困难了. 对了,你是不是在用MSN?要不怎么那么快就回了? |
回复: _variant_t的使用&VC
R:
不是,这是我公司的邮箱,outlook实时在线. 问题在于: 1) 查询接口的时候,不能传智能指针做参数 代码需写成: IAcadText *pText = NULL; pEnt->QueryInterface(IID_IAcadText,(void **)&pText); 2) 若要智能指针,可以直接写成 pText = pEnt; 3) 智能指针就不用释放了. PS:代码修改后,编译通过 bool CSampleWindow::FillTreeWithBlockEntities(HTREEITEM hParent, IAcadBlock *pBlock) { CComPtr<IUnknown> pUnk; CComQIPtr<IEnumVARIANT, &IID_IEnumVARIANT> pNewEnum; CComQIPtr<IAcadEntity, &IID_IAcadEntity> pEnt; CComQIPtr<IAcadText, &IID_IAcadText> pText;///我加的 // IAcadText *pText = NULL; if (SUCCEEDED(pBlock->get__NewEnum(&pUnk)) && pUnk != NULL) { VARIANT varItem; VariantInit(&varItem); pNewEnum = pUnk; while (pNewEnum->Next(1, &varItem, NULL) == S_OK) { CComBSTR bName; ///////////////////// CComBSTR bstring; //////////////////////////////// assert(VT_DISPATCH == varItem.vt); pEnt = varItem.pdispVal; VariantClear(&varItem); pEnt->get_ObjectName(&bName); /////////////////////////////////// if(_strcmpi("AcDbText",(LPCSTR)_bstr_t(bName,false))==0) { if (!pEnt) return false; long nTextCount = 0; /* try { pEnt->QueryInterface(IID_IAcadText,(void **)&pText); } catch(...) { } */ pText = pEnt; if (!pText) return false; pText->get_TextString(&bstring); _variant_t Point; VariantInit(&Point); pText->get_InsertionPoint(&Point); double *pPnt = NULL; long ind = 0; SafeArrayAccessData (Point.parray, (void**)&pPnt); SafeArrayUnaccessData(Point.parray); // release Point if no use VariantClear(&Point); InsertItem(m_wndView, (LPCTSTR)_bstr_t(bstring), 0, 1, 111, hParent, TVI_LAST); } } } return true; } |
回复: _variant_t的使用&VC
Q:
谢谢你的指导!!!还有个比较菜的问题double *pPnt = NULL;就一个值,又不是数组,怎么取X,Y值?不是要定义 double pPnt[]={0,0,0};么?这样取坐标不就方便了,直接 pPntX=pPnt[0];pPntY=pPnt[1];多好?但是这样的话前面的SafeArrayAccessData (Point.parray, (void**)&pPnt); SafeArrayUnaccessData(Point.parray); 还是一样的么?呵呵...........今天对智能指针又了解不少,跟在you后面学了很多,诚挚的感谢你!!! |
回复: _variant_t的使用&VC
R:
double *pPnt定义的是个指针,你要取值跟数组一样的取法,pPnt[0]是X值,pPnt[1]是Y值. |
回复: _variant_t的使用&VC
请问要对直线和文字进行几何信息的获取比较简单,但是要获取曲线段(如PolyLine)的各个顶点数据要如何做啊?
|
回复: _variant_t的使用&VC
PolyLine(5 vertex)
R = Radius of MIC circle unit theTa = 2PI / 5 (Anti-Clockwise) theTa = n(1, 2, 3, 4, 5) * unit theTa Vertex(x, y) = R[cos (theTa),sin (theTa)] |
所有的时间均为北京时间。 现在的时间是 12:32 AM. |