几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » DirectDWG
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2007-05-20, 09:30 AM   #1
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 _variant_t的使用&VC

隐藏帖
您没有登陆,无法查看此帖内容,请登陆或注册。
此帖为资历帖,只有帖子数 10 以上的会员才可查看此帖
yogy离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
旧 2007-05-20, 09:30 AM   #2
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _variant_t的使用&VC

铁心,

你好,你的问题没法调试,很难说清楚的.你先了解一下_variant_这个类型怎么用?!或在opendwg官方论坛上去问.还是不行的话,如果你方便,就把相关的部分源程序发给我吗?我帮你调试一下看看. 对了,你用的哪个版本的opendwg?
Yogy
yogy离线中   回复时引用此帖
旧 2007-05-20, 09:31 AM   #3
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _variant_t的使用&VC

Yogy,


你回复的好快啊!呵呵............


我现在用的就是免费的那个版本,DWGdirectX 1.12.zip


其实我就是在那个VC例子改的,没有什么不方便的,另外我在那论坛上问了,还没人回答我!
铁心
yogy离线中   回复时引用此帖
旧 2007-05-20, 09:31 AM   #4
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _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;

}
yogy离线中   回复时引用此帖
旧 2007-05-20, 09:32 AM   #5
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _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图纸给你看看,另外还有两个图片.

对不起,我有疑问就提出来了,有什么不对的地方请多多包涵!!!
yogy离线中   回复时引用此帖
旧 2007-05-20, 09:33 AM   #6
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _variant_t的使用&VC

R:
1)你若想知道get_TextString函数的所带的参数,你可在Arxsearch,ArxOpenDWG中的定义都一致.

2)运行报的错,你可点”ignore”,程序还是可以接着往下运行的,具体什么原因导致的还待查查.

3)你在得到文本的名字,做个设计者字符串比较呀,不过,遇到不同语种,不知你想过么?

4)若每张图的大小都不一样,不知你打算怎么靠插入点来过滤信息?

5)你的图纸若是都有规律可循,倒是还简单点
yogy离线中   回复时引用此帖
旧 2007-05-20, 09:33 AM   #7
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _variant_t的使用&VC

Q:
我点了忽略还是不行的哦,还有你说的语种那没问题,因为只做中文的,呵呵....所有的标题栏都是按照国标规定的,例如我得到"设计"这个字符串的话,设计者的名字不就肯定在它后面么?它们的Y坐标是一样的,X坐标推后一点,在一个区间范围内的,超过范围那就肯定不对了.这样不就过滤信息了么?对这样想法我认为没问题,关键就是实施起来就是很困难了.
   对了,你是不是在用MSN?要不怎么那么快就回了?
yogy离线中   回复时引用此帖
旧 2007-05-20, 09:34 AM   #8
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _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;

}
yogy离线中   回复时引用此帖
旧 2007-05-20, 09:35 AM   #9
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _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后面学了很多,诚挚的感谢你!!!










yogy离线中   回复时引用此帖
旧 2007-05-20, 09:35 AM   #10
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _variant_t的使用&VC

R:
double *pPnt定义的是个指针,你要取值跟数组一样的取法,pPnt[0]X,pPnt[1]Y.
yogy离线中   回复时引用此帖
旧 2009-01-26, 02:36 PM   #11
flash123456
初级会员
 
注册日期: 09-01
帖子: 2
精华: 0
现金: 38 标准币
资产: 38 标准币
flash123456 向着好的方向发展
默认 回复: _variant_t的使用&VC

请问要对直线和文字进行几何信息的获取比较简单,但是要获取曲线段(如PolyLine)的各个顶点数据要如何做啊?
flash123456离线中   回复时引用此帖
旧 2009-02-11, 02:23 PM   #12
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: _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)]
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 01:59 PM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多