CAD ObjectARX扩展工具的源码(三)

2024-02-29 06:48

本文主要是介绍CAD ObjectARX扩展工具的源码(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CAD ObjectARX扩展工具的源码(三)
//得到文本边界
oid CDrawFunction::getTextBoundary(AcDbObjectId objectId,double offset,AcDbObjectId &textBoundaryId)
{
AcDbExtents Ext;
AcDbEntity *pEnt;
acdbOpenObject(pEnt,objectId,AcDb::kForWrite);
if(pEnt->isKindOf(AcDbText::desc()))
{
AcDbText *pText=AcDbText::cast(pEnt);
AcGePoint3d basePoint;
basePoint=pText->position();
double rotateAngle=pText->rotation();
pText->setRotation(0);
pText->getGeomExtents(Ext);
AcGePoint3d minPt,maxPt;
minPt=Ext.minPoint();
maxPt=Ext.maxPoint();
AcGePoint3dArray pointArray;
AcGePoint3d point1,point2,point3,point4;
point1.x=minPt.x-offset;point1.y=minPt.y-offset;point1.z=0;
pointArray.append(point1);
point2.x=maxPt.x+offset;point2.y=minPt.y-offset;point2.z=0;
pointArray.append(point2);
point3.x=maxPt.x+offset;point3.y=maxPt.y+offset;point3.z=0;
pointArray.append(point3);
point4.x=minPt.x-offset;point4.y=maxPt.y+offset;point4.z=0;
pointArray.append(point4);
DrawPolyline(textBoundaryId,pointArray,1,0,TRUE,"0","CONTINUOUS");
AcGeMatrix3d matrix;
AcGeector3d axis;
ident_init(matrix);
axis.set(0,0,1);
matrix=matrix.rotation(rotateAngle,axis,basePoint); //旋转矩阵
AcDbEntity *BounEnt;
acdbOpenObject(BounEnt,textBoundaryId,AcDb::kForWrite);
BounEnt->transformBy(matrix);
BounEnt->close();
pText->setRotation(rotateAngle);
}
else if(pEnt->isKindOf(AcDbMText::desc()))
{
AcDbMText *pMtext=AcDbMText::cast(pEnt);
AcGePoint3d basePoint;
basePoint=pMtext->location();
double rotateAngle=pMtext->rotation();
pMtext->setRotation(0);
AcGePoint3dArray pointArray;
double width=pMtext->actualWidth();
double height=pMtext->actualHeight();
AcGePoint3d point1,point2,point3,point4;
point1.x=basePoint.x-offset;point1.y=basePoint.y+offset;point1.z=0;
pointArray.append(point1);
point2.x=basePoint.x+width+offset;point2.y=basePoint.y+offset;point2.z=0;
pointArray.append(point2);
point3.x=basePoint.x+width+offset;point3.y=basePoint.y-height-offset;point3.z=0;
pointArray.append(point3);
point4.x=basePoint.x-offset;point4.y=basePoint.y-height-offset;point4.z=0;
pointArray.append(point4);
DrawPolyline(textBoundaryId,pointArray,1,0,TRUE,"0","CONTINUOUS");
AcGeMatrix3d matrix;
AcGeector3d axis;
ident_init(matrix);
axis.set(0,0,1);
matrix=matrix.rotation(rotateAngle,axis,basePoint); //旋转矩阵
AcDbEntity *BounEnt;
acdbOpenObject(BounEnt,textBoundaryId,AcDb::kForWrite);
BounEnt->transformBy(matrix);
BounEnt->close();
pMtext->setRotation(rotateAngle);
}
pEnt->close();
return;
}


AcDbObjectId CDrawFunction::createNewLayer(CString LayerName)
{
AcDbLayerTable *LayerTable;
acdbHostApplicationSerices()->workingDatabase()->getSymbolTable(LayerTable,AcDb::kForWrite);
AcDbObjectId LayerId;
if(!LayerTable->has(LayerName))
{
AcDbLayerTableRecord *LayerTableRecord=new AcDbLayerTableRecord;
LayerTableRecord->setName(LayerName);
LayerTable->add(LayerId,LayerTableRecord);
LayerTableRecord->close();
}
else
{
LayerTable->getAt(LayerName,LayerId,FALSE);
}
LayerTable->close();
return LayerId;
}

bool CDrawFunction::insertBlock(AcDbObjectId &newEntId,CString BlockName,double fwj,AcGePoint3d basePoint,double scalex,
CString Text1,CString Text2,CString Text3,
int text1color,int text2color,int text3color,
double text1height,double text2height,double text3height,
double text1scator,double text2scator,double text3scator,
CString littleFont,CString bigFont,CString layerName,double dx,double dy) //每块可有三个属性定义
{
AcDbObjectId blockId;
double x,y;
x=basePoint[X];
y=basePoint[Y];
bool a=AcDbSymbolUtilities::hasBlock(BlockName.GetBuffer(BlockName.GetLength()),acdbHostApplicationSerices()->workingDatabase());
if(!a)return FALSE;
AcDbSymbolUtilities::getBlockId(blockId,BlockName.GetBuffer(BlockName.GetLength()),acdbHostApplicationSerices()->workingDatabase());
AcDbBlockReference *pBlkRef = new AcDbBlockReference;
// pBlkRef->treatAsAcDbBlockRefForExplode();///
pBlkRef->setBlockTableRecord(blockId);
pBlkRef->setLayer(layerName);//设置层/
struct resbuf to, from;
from.restype = RTSHORT;
from.resal.rint = 1; // UCS
to.restype = RTSHORT;
to.resal.rint = 0; // WCS
AcGeector3d normal(0, 0, 1);
acedTrans(&(normal.x), &from, &to, Adesk::kTrue,&(normal.x));
AcGeScale3d scale(scalex,scalex,scalex);
pBlkRef->setScaleFactors(scale);
AcGePoint3d insertPoint;
insertPoint=basePoint;
pBlkRef->setPosition(basePoint);
pBlkRef->setRotation(fwj);
pBlkRef->setNormal(normal);
pBlkRef->setColorIndex(text1color);//按文本颜色设置改变颜色
pBlkRef->setLayer(layerName);
AcDbBlockTable *pBlockTable;
acdbHostApplicationSerices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForWrite);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
pBlockTableRecord->appendAcDbEntity(newEntId, pBlkRef);
pBlockTable->close();
pBlockTableRecord->close();

acdbOpenObject(pBlockTableRecord, blockId, AcDb::kForRead);
AcDbBlockTableRecordIterator *pIterator;
pBlockTableRecord->newIterator(pIterator);
AcDbEntity *pEnt;
AcDbAttributeDefinition *pAttdef;
for (pIterator->start(); !pIterator->done();pIterator->step())
{
pIterator->getEntity(pEnt, AcDb::kForWrite);
//pEnt->setColorIndex(text1color);//按文本颜色设置改变颜色
//pEnt->setLayer(layerName);//设置层
if(pEnt->isKindOf(AcDbAttributeDefinition::desc()))
{
pAttdef = AcDbAttributeDefinition::cast(pEnt);
if (pAttdef != NULL && !pAttdef->isConstant())
{
AcDbAttribute *pAtt = new AcDbAttribute();
pAtt->setPropertiesFrom(pAttdef);
pAtt->setInisible(pAttdef->isInisible());
AcGePoint3d alignpoint;
alignpoint=pAttdef->alignmentPoint();
alignpoint+=pBlkRef->position().asector();
AcDbObjectId TextStyleId;
TextStyleId=createTextStyle(littleFont,bigFont,"xianlu");
pAtt->setTextStyle(TextStyleId);
pAtt->setHeight(pAttdef->height());
pAtt->setTag("Tag");
pAtt->setFieldLength(25);
pAtt->setLayer(layerName);
char *pStr = pAttdef->tag();
pAtt->setTag(pStr);
free(pStr);
pAtt->setFieldLength(pAttdef->fieldLength());
if(strcmp(pAtt->tag(),"标注1")==0)
{
AcGePoint3d gg(dx/scalex,0,0);
alignpoint=alignpoint+gg.asector();
AcGeector3d et(0,0,1);
alignpoint=alignpoint.scaleBy(scalex,insertPoint);
alignpoint=alignpoint.rotateBy(fwj,et,insertPoint);
pAtt->setTextString(Text1.GetBuffer(Text2.GetLength()));
pAtt->setRotation(PI/2+fwj);
pAtt->setHorizontalMode(AcDb::kTextCenter);
pAtt->seterticalMode(AcDb::kTextBottom);
pAtt->setAlignmentPoint(alignpoint);
pAtt->setColorIndex(text1color);
pAtt->setHeight(text1height*scalex);
pAtt->setWidthFactor(text1scator);
}
if(strcmp(pAtt->tag(),"标注2")==0)
{
AcGePoint3d gg(dx/scalex,0,0);
alignpoint=alignpoint-gg.asector();
AcGeector3d et(0,0,1);
alignpoint=alignpoint.scaleBy(scalex,insertPoint);
alignpoint=alignpoint.rotateBy(fwj,et,insertPoint);
pAtt->setTextString(Text2.GetBuffer(Text2.GetLength()));
pAtt->setRotation(PI/2+fwj);
pAtt->setHorizontalMode(AcDb::kTextCenter);
pAtt->seterticalMode(AcDb::kTextBottom);
pAtt->setAlignmentPoint(alignpoint);
pAtt->setColorIndex(text2color);
pAtt->setHeight(text2height*scalex);
pAtt->setWidthFactor(text2scator);
}
if(strcmp(pAtt->tag(),"标注3")==0)
{
AcGePoint3d gg(0,dy/scalex,0);
alignpoint=alignpoint+gg.asector();
AcGeector3d et(0,0,1);
alignpoint=alignpoint.scaleBy(scalex,insertPoint);
alignpoint=alignpoint.rotateBy(fwj,et,insertPoint);
pAtt->setTextString(Text3.GetBuffer(Text3.GetLength()));
pAtt->setRotation(fwj);
pAtt->setHorizontalMode(AcDb::kTextCenter);
pAtt->seterticalMode(AcDb::kTextBottom);
pAtt->setAlignmentPoint(alignpoint);
pAtt->setColorIndex(text3color);
pAtt->setHeight(text3height*scalex);
pAtt->setWidthFactor(text3scator);
}
AcDbObjectId attId;
pBlkRef->appendAttribute(attId, pAtt);
pAtt->close();
}
}
// pEnt->setColorIndex(text1color);//按文本颜色设置改变颜色
pEnt->close();
}
delete pIterator;
pBlockTableRecord->close();
pBlkRef->close();
return TRUE;
}


//遍历多义线顶点坐标
Acad::ErrorStatus CDrawFunction::IteratorPolyline(AcDbObjectId polylineID,AcGePoint3dArray& pointArray)
{
Acad::ErrorStatus es=Acad::eOk;
AcDbObject* pObject=NULL;
AcDbPolyline *pline=NULL;
if((es=acdbOpenObject(pObject,polylineID,AcDb::kForRead))!=Acad::eOk)
return es;
if(!pObject->isKindOf(AcDbPolyline::desc()))
{
pObject->close();
return Acad::eInalidInput;
}
pline=AcDbPolyline::cast(pObject);
int num=pline->numerts();
for (int i=0; i< num; i++)
{
AcGePoint3d temPt;
if((es=pline->getPointAt(i, temPt))!=Acad::eOk)
{
pObject->close();
return Acad::eInalidInput;
}
pointArray.append(temPt);
}
pObject->close();
return es;
}


Acad::ErrorStatus CDrawFunction::createGroup(CString groupname,AcDbObjectIdArray IdArray)
{
Acad::ErrorStatus es=Acad::eOk;
AcDbDictionary *pGroupDict=NULL;
AcDbGroup *pGroup=NULL;
if((es=acdbHostApplicationSerices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite))!=Acad::eOk)
{
return es;
}
AcDbObjectId groupId;
es=pGroupDict->getAt(groupname,groupId);
if(es==Acad::eInalidKey)
{
acutPrintf("/n输入的词典名无效!");
pGroupDict->close();
return es;
}
else if(es==Acad::eKeyNotFound)
{
pGroup=new AcDbGroup("GroupDiscription");
if((es=pGroupDict->setAt(groupname,pGroup,groupId))!=Acad::eOk)
{
pGroup->close();pGroupDict->close();return es;
}
}
else if(es==Acad::eOk )
{
if((es=acdbOpenObject(pGroup,groupId,AcDb::kForWrite))!=Acad::eOk)
{
pGroupDict->close();return es;
}
}
for(int i=0;i pGroup->append(IdArray[i]);
pGroup->setSelectable(FALSE);
pGroupDict->close();
pGroup->close();
return es;
}

double CDrawFunction::getTextLength(AcDbObjectId textId)
{
Acad::ErrorStatus es=Acad::eOk;
AcDbEntity *pEnt=NULL;
if((es=acdbOpenObject(pEnt,textId,AcDb::kForRead))!=Acad::eOk)
return -1;
AcDbExtents Ext;
pEnt->getGeomExtents(Ext);
pEnt->close();
AcGePoint3d minPt,maxPt;
minPt=Ext.minPoint();
maxPt=Ext.maxPoint();
return acutDistance(asDblArray(minPt),asDblArray(maxPt));
}



oid CDrawFunction::highlightEdge(const AcDbObjectId& objId,const int marker)
{
char dummy[133];
AcDbEntity *pEnt;
acdbOpenObject(pEnt,objId,AcDb::kForRead);
AcGePoint3d pickpnt;
AcGeMatrix3d xform;
int numIds;
AcDbFullSubentPath *subentIds;
pEnt->getSubentPathsAtGsMarker(AcDb::kEdgeSubentType,marker,pickpnt,xform,numIds,subentIds);
if(numIds>0)
{
pEnt->highlight(subentIds[0]);
ads_getstring(0,"/npressto continue...",dummy);
pEnt->unhighlight(subentIds[0]);

}
delete []subentIds;
pEnt->close();
}


Acad::ErrorStatus CDrawFunction::readXrecord(CString dictName,CString xrecordName,CString &message)
{
AcDbDictionary *pDict=NULL;
pDict=openDictionaryForRead(dictName,acdbHostApplicationSerices()->workingDatabase());
if(pDict)
{
AcDbXrecord *pXrec;
pDict->getAt(xrecordName, (AcDbObject*&) pXrec,AcDb::kForRead);
pDict->close();
struct resbuf *pRbList;
pXrec->rbChain(&pRbList);
pXrec->close();
message=pRbList->resal.rstring;
acutRelRb(pRbList);
return Acad::eOk;
}
else
{
return Acad::eInalidInput;
}
}


//
//
//
AcDbDictionary* CDrawFunction::openDictionaryForWrite(LPCTSTR dictName,
bool createIfNotFound,AcDbDictionary* parentDict)
{
ASSERT(dictName != NULL);
ASSERT(parentDict != NULL);
ASSERT(parentDict->isWriteEnabled());
AcDbDictionary* dict = NULL;
AcDbObject* obj;
Acad::ErrorStatus es;
es = parentDict->getAt(dictName, obj, AcDb::kForWrite);
if (es == Acad::eOk)
{
dict = AcDbDictionary::cast(obj);
}
else if (es == Acad::eKeyNotFound)
{
if (createIfNotFound)
{
dict = new AcDbDictionary;
AcDbObjectId dictId;
es = parentDict->setAt(dictName, dict, dictId);
if (es != Acad::eOk)
{
delete dict;dict = NULL;
}
}
}
return dict;
}

这篇关于CAD ObjectARX扩展工具的源码(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757909

相关文章

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核