找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6065|回复: 50

[ARX程序]:自写ACAD扩展工具

[复制链接]
发表于 2003-11-17 11:51:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
上 传一个自写的CAD扩展工具,包括坐标标注系统,图层操作 工具,文本操作工具,修改实体(包括块)的工具,望多提意见,加载ARX后,输入SHOWEXTOOL后出现工具栏,即可操作
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-11-17 21:02:38 | 显示全部楼层
不错的东东,值得一用。
多谢你的无私奉献。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-18 10:12:34 | 显示全部楼层
上载工具函数库部分核心代码
Acad::ErrorStatus CDrawFunction::getAllEntity(AcDbDatabase *pDb,AcDbObjectIdArray& IdArr,
const AcArray& layerNameArr)
{
Acad::ErrorStatus es=Acad::eOk;
ASSERT(pDb);
if(pDb==NULL)
return Acad::eInvalidInput;
AcDbBlockTable *pBlkTable=NULL;
if((es=pDb->getBlockTable(pBlkTable,AcDb::kForRead))!=Acad::eOk)//打开块表
{
acedAlert("打开块表失败");
return es;
}
AcDbBlockTableRecord *pBlkTableRecord=NULL;
if((es=pBlkTable->getAt(ACDB_MODEL_SPACE,pBlkTableRecord,AcDb::kForRead))!=Acad::eOk)//打开块表记录
{
acedAlert("打开块表记录失败");
pBlkTable->close();
return es;
}
pBlkTable->close();//关闭块表

AcDbBlockTableRecordIterator *pIterator=NULL; //创建叠代器
if((es=pBlkTableRecord->newIterator(pIterator))!=Acad::eOk)
{
pBlkTableRecord->close();
return es;
}

CAcModuleResourceOverride resoverride;
CProgressDlg progress;
progress.Create();
progress.SetPos(0);
progress.SetWindowText("正在检测图形中所有实体...");

for(pIterator->start();!pIterator->done();pIterator->step())//遍历整个数据库
{
AcDbEntity *entity=NULL;
es=pIterator->getEntity(entity,AcDb::kForRead); //打开实体

if(es==Acad::eLockViolation)
{
acedAlert("内存锁定");
}
else if(es==Acad::eWasOpenForWrite)
{
acedAlert("实体以写方式打开");
}
else if(es==Acad::eWasOpenForRead)
{
acedAlert("实体以读方式打开");
}
else
{
if(layerNameArr.contains(entity->layer()))
IdArr.append(entity->objectId());
entity->close();
}
progress.StepIt();
}
delete pIterator;pIterator=NULL;
pBlkTableRecord->close();
acutPrintf("eend");
return es;
}

//得到指定层上指定颜色的所有实体
Acad::ErrorStatus CDrawFunction::getAllEntity(AcDbDatabase *pDb,AcDbObjectIdArray& IdArr,
const AcArray& layerNameArr,Adesk::UInt16 colorIndex)
{
Acad::ErrorStatus es=Acad::eOk;
ASSERT(pDb);
if(pDb==NULL)
return Acad::eInvalidInput;
AcDbBlockTable *pBlkTable=NULL;
if((es=pDb->getBlockTable(pBlkTable,AcDb::kForRead))!=Acad::eOk)//打开块表
{
acedAlert("打开块表失败");
return es;
}
AcDbBlockTableRecord *pBlkTableRecord=NULL;
if((es=pBlkTable->getAt(ACDB_MODEL_SPACE,pBlkTableRecord,AcDb::kForRead))!=Acad::eOk)//打开块表记录
{
acedAlert("打开块表记录失败");
pBlkTable->close();
return es;
}
pBlkTable->close();//关闭块表

AcDbBlockTableRecordIterator *pIterator=NULL; //创建叠代器
if((es=pBlkTableRecord->newIterator(pIterator))!=Acad::eOk)
{
pBlkTableRecord->close();
return es;
}

CAcModuleResourceOverride resoverride;
CProgressDlg progress;
progress.Create();
progress.SetPos(0);
progress.SetWindowText("正在检测图形中所有实体...");

for(pIterator->start();!pIterator->done();pIterator->step())//遍历整个数据库
{
AcDbEntity *entity=NULL;
if((es=pIterator->getEntity(entity,AcDb::kForRead))!=Acad::eOk)//打开实体
{
delete pIterator;pIterator=NULL;
pBlkTableRecord->close();
return es;
}
if(layerNameArr.contains(entity->layer())&&entity->colorIndex()==colorIndex)
IdArr.append(entity->objectId());
entity->close();
progress.StepIt();
}
delete pIterator;pIterator=NULL;
pBlkTableRecord->close();
return es;
}

//得到图形中所有的层
Acad::ErrorStatus CDrawFunction::getAllLayerName(AcDbDatabase *pDb,CStringArray& layerArray)
{
Acad::ErrorStatus es=Acad::eOk;
if(pDb==NULL)
return Acad::eInvalidInput;
layerArray.RemoveAll();
AcDbLayerTable *pLayerTable=NULL;
if((es=pDb->getSymbolTable(pLayerTable,AcDb::kForRead))!=Acad::eOk)
{
pLayerTable->close();
return es;
}
//创建一个层表迭代器
AcDbLayerTableIterator *pLayerTableIterator;
pLayerTable->newIterator(pLayerTableIterator);
pLayerTable->close();

char *pLayerName=NULL;
CString name;
for(int i=0;!pLayerTableIterator->done();pLayerTableIterator->step(),i++)
{
AcDbLayerTableRecord *pLayerTableRecord=NULL;
pLayerTableIterator->getRecord(pLayerTableRecord,AcDb::kForRead);
pLayerTableRecord->getName(pLayerName);
name.Format("%s",pLayerName);
pLayerTableRecord->close();
layerArray.Add(name);

}

if(pLayerName) acutDelString(pLayerName);
delete pLayerTableIterator;pLayerTableIterator=NULL;
return es;
}


//*************根据线形名得到线型ID********************//
//******************************************************//
BOOL CDrawFunction::getLinetypeIdFromString(const char* str, AcDbObjectId& id)
{
//----查找安装目录----//
CString AcadInstallPath;
FindAcadInstallPath(AcadInstallPath);
CString File=AcadInstallPath+"\\linetype\\user.lin";
//-----查找完毕--------//
ASSERT(str!=NULL);
AcDbLinetypeTable *pLinetypeTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLinetypeTable, AcDb::kForRead);
Acad::ErrorStatus mess;
mess=pLinetypeTable->getAt(str,id);
if(mess==Acad::eKeyNotFound||mess==Acad::ePermanentlyErased)
{
pLinetypeTable->close();
Acad::ErrorStatus error;

error=acdbLoadLineTypeFile(str,File.GetBuffer(0),acdbHostApplicationServices()->workingDatabase());
if(error==Acad::eNullObjectPointer)
{
AcDbLinetypeTable *pLinetypeTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLinetypeTable, AcDb::kForRead);
pLinetypeTable->getAt("CONTINUOUS", id);
pLinetypeTable->close();
return FALSE;
}
else if(error==Acad::eFileSystemErr)
{
AfxMessageBox("the specified file cannot be opened");
return FALSE;
}
else if(error==Acad::eUndefinedLineType)
{
AcDbLinetypeTable *pLinetypeTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLinetypeTable, AcDb::kForRead);
AfxMessageBox("the linetype name specified by ltname is not found in the file");
pLinetypeTable->getAt("CONTINUOUS", id);
pLinetypeTable->close();
return TRUE;
}
AcDbLinetypeTable *pLinetypeTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLinetypeTable, AcDb::kForRead);
pLinetypeTable->getAt(str,id);
pLinetypeTable->close();
return TRUE;
}
pLinetypeTable->close();
return TRUE;
}



void CDrawFunction::FindAcadInstallPath(CString &AcadInstallPath)
{
//查找样式目录安装路径
TCHAR AcadPath[255];
HKEY hKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\线路处开发组\\RDS2002\\1.00"),0,KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS)
{
::AfxMessageBox("注册路径不对");
return ;
}
DWORD dwDataType=REG_SZ;
DWORD dwLength=255;
LONG lRet=RegQueryValueEx(hKey,TEXT("path"),NULL,NULL,(LPBYTE)AcadPath,&dwLength);
RegCloseKey(hKey);
if(lRet!=ERROR_SUCCESS)
{
acutPrintf("Read failed\n");
return ;
}
//-----查找完毕--------//
AcadInstallPath.Format("%s",AcadPath);
}

AcDbObjectId CDrawFunction::createTextStyle(CString fontName,CString bigFontName,CString textStyleName)
{
AcGiTextStyle *TextStyle=new AcGiTextStyle
(fontName,
bigFontName,
0,
0.67,
0,
0,
Adesk::kFalse,
Adesk::kFalse,
Adesk::kFalse,
Adesk::kFalse,
Adesk::kFalse,
textStyleName); //字体名
AcDbObjectId textStyleId;
toAcDbTextStyle(*TextStyle,textStyleId);
return textStyleId;
}



//*******************wuweifan2002.12.12*************************//
//********************插入多行文本***************************//
//************************************************************//
AcDbObjectId CDrawFunction::createMutiText(AcGePoint3d BasePoint,AcDb::TextHorzMode hMode,AcDb::TextVertMode vMode,CString Text,double texthight,double widthfactor,double angle,int color,CString smallFontName,CString bigFontName,CString layerName)
{
ASSERT(Text!=NULL);
AcDbMText *pMText=new AcDbMText();
if(pMText==NULL)
throw Acad::eOutOfMemory;
AcDbObjectId TextStyleId;
TextStyleId=createTextStyle(smallFontName,bigFontName,"xianlu");
pMText->setTextStyle(TextStyleId);
pMText->setContents(Text.GetBuffer(Text.GetLength()));
pMText->setTextHeight(texthight);
pMText->setRotation(angle);
pMText->setLineSpacingFactor(0.8);
pMText->setColorIndex(color);
if(layerName!="")
pMText->setLayer(layerName.GetBuffer(0));
AcDbObjectId MTextId;
addToModelSpace(MTextId, pMText);
pMText->close();
return MTextId;
}

//********************插入单行文本***************************//
//************************************************************//
AcDbObjectId CDrawFunction::createtextAll(AcGePoint3d pt,char *text,AcDb::TextHorzMode hMode,AcDb::TextVertMode vMode,double hight,double widthFactor,double rotation,int color,CString smallFontName,CString bigFontName,CString layerName)
{
ASSERT(text!=NULL);
AcDbText *pText=NULL;
pText=new AcDbText;
if(pText==NULL)
throw Acad::eOutOfMemory;
AcDbObjectId textId;
textId=createTextStyle(smallFontName,bigFontName,"xianlu");
pText->setTextStyle(textId);
pText->setTextString(text);
pText->setHeight(hight);
pText->setColorIndex(color);
pText->setRotation(rotation);
pText->setWidthFactor(widthFactor);
pText->setPosition(pt);
if(layerName!="")
pText->setLayer(layerName.GetBuffer(0));
addToModelSpace(textId, pText);
pText->close();
return textId;
}

//设置尺寸文本样式
void CDrawFunction::setDimTextStyle(AcDbObjectId dimId,AcDbObjectId textStyleId,
int colorIndex,double textHeight,double textScator,
double textGap,bool align)
{
AcDbDimension *dimText;
acdbOpenObject(dimText,dimId,AcDb::kForWrite);
dimText->setDimtxsty(textStyleId); //文本字体DIMTXSTY
AcCmColor color;
color.setColorIndex(colorIndex);
dimText->setDimclrt(color);//文本颜色DIMCLRT
dimText->setDimtxt(textHeight); //文本高度DIMTXT
dimText->setDimtfac(textScator);//文本高宽比DIMTFAC
dimText->setDimgap(textGap);//文本距尺寸距离DIMGAP
dimText->setDimtoh(align);//文本标注DIMTOH
dimText->close();
}

//设置尺寸延伸线类型
Acad::ErrorStatus CDrawFunction::setextensionlineStyle(AcDbObjectId dimId,int colorIndex,double length,
double offLength,bool v1,bool v2)
{
Acad::ErrorStatus es=Acad::eOk;
AcDbDimension *dimText=NULL;
if((es=acdbOpenObject(dimText,dimId,AcDb::kForWrite))!=Acad::eOk)
return es;
AcCmColor color;
if((es=color.setColorIndex(colorIndex))!=Acad::eOk)
{
dimText->close();return es;
}
dimText->setDimclre(color);//设置颜色DIMCLRE
dimText->setDimexe(length);//设置超出长度DIMEXE
dimText->setDimexo(offLength);//尺寸偏离长度DIMEXO
dimText->setDimse1(v1);//是否注第一条线DIMSE1
dimText->setDimse2(v2);//是否注第二条线DIMSE2
dimText->close();
return es;
}
//绘制对齐尺寸线
AcDbObjectId CDrawFunction::drawDimension(AcGePoint3d xLine1Point,AcGePoint3d xLine2Point,
double fwj,int direction,double distance,CString dimText,CString m_cLayerName)
{

AcDbAlignedDimension *dimension=new AcDbAlignedDimension;
AcGePoint3d dimLinePoint;
// CCalcuMethod *calcu=new CCalcuMethod();
// calcu->calEndZbSelf(xLine2Point,distance*direction,fwj,dimLinePoint);
// delete calcu;calcu=NULL;
dimension->setXLine1Point(xLine1Point);
dimension->setDimLinePoint(dimLinePoint);
dimension->setXLine2Point(xLine2Point);
dimension->setDimensionText(dimText.GetBuffer(0));
dimension->setLayer(m_cLayerName.GetBuffer(0));
AcDbObjectId dimId;
addToModelSpace(dimId,dimension);
dimension->close();
return dimId;
}

Acad::ErrorStatus CDrawFunction::createLine(AcDbObjectId &lineId,AcGePoint3d startPt,AcGePoint3d endPt,int color,CString Layer,char *linetype)
{
Acad::ErrorStatus es=Acad::eOk;
ASSERT(linetype!=NULL);
AcDbLine *pLine = new AcDbLine(startPt, endPt);
if((es=pLine->setColorIndex(color))!=Acad::eOk)
{
pLine->close();return es;
}
if(Layer!="")
{
if(pLine->setLayer(Layer)==Acad::eKeyNotFound \
||pLine->setLayer(Layer)==Acad::eDeletedEntry )
{
createNewLayer(Layer);
if((es=pLine->setLayer(Layer.GetBuffer(0)))!=Acad::eOk)
{
pLine->close();return es;
}
}
}
if(linetype!=NULL)
{
AcDbObjectId lineTypeId;
if(getLinetypeIdFromString(linetype,lineTypeId))
{
if((es=pLine->setLinetype(lineTypeId))!=Acad::eOk)
{
pLine->close();return es;
}
if((es=pLine->setLinetypeScale(1))!=Acad::eOk)
{
pLine->close();return es;
}
}
}
es=addToModelSpace(lineId,pLine);
return es;
}

Acad::ErrorStatus CDrawFunction::createCircle(AcDbObjectId& circleId,AcGePoint3d center,double radius,int color,CString layer)
{
Acad::ErrorStatus es=Acad::eOk;
AcGeVector3d normal(0,0,1);
AcDbCircle *circle=new AcDbCircle(center,normal,radius);
if((es=circle->setColorIndex(color))!=Acad::eOk)
{
circle->close();return es;
}
if(layer!="")
{
if(circle->setLayer(layer)==Acad::eKeyNotFound \
||circle->setLayer(layer)==Acad::eDeletedEntry )
{
createNewLayer(layer);
if((es=circle->setLayer(layer.GetBuffer(0)))!=Acad::eOk)
{
circle->close();return es;
}
}
}
es=addToModelSpace(circleId,circle);
return es;
}


Acad::ErrorStatus CDrawFunction::DrawPolyline(AcDbObjectId& polylineId, AcGePoint3dArray ptArr, int Color, double Width,bool IsClose,CString Layer,char *linetype)
{
Acad::ErrorStatus es=Acad::eOk;
AcDb2dPolyline *pNewPline;
if(IsClose)pNewPline=new AcDb2dPolyline(AcDb::k2dSimplePoly,ptArr,0,Adesk::kTrue,Width,Width);
else pNewPline=new AcDb2dPolyline(AcDb::k2dSimplePoly,ptArr,0,Adesk::kFalse,Width,Width);
if((es=pNewPline->setColorIndex(Color))!=Acad::eOk)
{
pNewPline->close();return es;
}
if(Layer!="")
{
if(pNewPline->setLayer(Layer)==Acad::eKeyNotFound \
||pNewPline->setLayer(Layer)==Acad::eDeletedEntry )
{
createNewLayer(Layer);
if((es=pNewPline->setLayer(Layer))!=Acad::eOk)
{
pNewPline->close();return es;
}
}
}
if(linetype!=NULL)
{
AcDbObjectId lineTypeId;
if(getLinetypeIdFromString(linetype,lineTypeId))
{
if((es=pNewPline->setLinetype(lineTypeId))!=Acad::eOk)
{
pNewPline->close();return es;
}
if((es=pNewPline->setLinetypeScale(1))!=Acad::eOk)
{
pNewPline->close();return es;
}
}
}
if(!pNewPline->isLinetypeGenerationOn())
{
if((es=pNewPline->setLinetypeGenerationOn())!=Acad::eOk)
{
pNewPline->close();return es;
}
}
es=addToModelSpace(polylineId,pNewPline);
return es;
}

Acad::ErrorStatus CDrawFunction::DrawSplinePolyline(AcDbObjectId& polylineId, AcGePoint3dArray ptArr, int Color, double Width,bool IsClose,CString Layer,char *linetype)
{
Acad::ErrorStatus es=Acad::eOk;
AcDb2dPolyline *pNewPline;
if(IsClose)pNewPline=new AcDb2dPolyline(AcDb::k2dQuadSplinePoly,ptArr,0,Adesk::kTrue,Width,Width);
else pNewPline=new AcDb2dPolyline(AcDb::k2dQuadSplinePoly,ptArr,0,Adesk::kFalse,Width,Width);
if((es=pNewPline->setColorIndex(Color))!=Acad::eOk)
{
pNewPline->close();return es;
}
if(Layer!="")
{
if(pNewPline->setLayer(Layer)==Acad::eKeyNotFound \
||pNewPline->setLayer(Layer)==Acad::eDeletedEntry )
{
createNewLayer(Layer);
if((es=pNewPline->setLayer(Layer))!=Acad::eOk)
{
pNewPline->close();return es;
}
}
}
if(linetype!=NULL)
{
AcDbObjectId lineTypeId;
if(getLinetypeIdFromString(linetype,lineTypeId))
{
if((es=pNewPline->setLinetype(lineTypeId))!=Acad::eOk)
{
pNewPline->close();return es;
}
if((es=pNewPline->setLinetypeScale(1))!=Acad::eOk)
{
pNewPline->close();return es;
}
}
}
if(!pNewPline->isLinetypeGenerationOn())
{
if((es=pNewPline->setLinetypeGenerationOn())!=Acad::eOk)
{
pNewPline->close();return es;
}
}
es=addToModelSpace(polylineId,pNewPline);
return es;
}


//得到文本边界
void 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;
AcGeVector3d 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;
AcGeVector3d 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;
acdbHostApplicationServices()->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()),acdbHostApplicationServices()->workingDatabase());
if(!a)return FALSE;
AcDbSymbolUtilities::getBlockId(blockId,BlockName.GetBuffer(BlockName.GetLength()),acdbHostApplicationServices()->workingDatabase());
AcDbBlockReference *pBlkRef = new AcDbBlockReference;
// pBlkRef->treatAsAcDbBlockRefForExplode();///////////
pBlkRef->setBlockTableRecord(blockId);
pBlkRef->setLayer(layerName);//设置层/////////////////////////////
struct resbuf to, from;
from.restype = RTSHORT;
from.resval.rint = 1; // UCS
to.restype = RTSHORT;
to.resval.rint = 0; // WCS
AcGeVector3d 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;
acdbHostApplicationServices()->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->setInvisible(pAttdef->isInvisible());
AcGePoint3d alignpoint;
alignpoint=pAttdef->alignmentPoint();
alignpoint+=pBlkRef->position().asVector();
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.asVector();
AcGeVector3d vet(0,0,1);
alignpoint=alignpoint.scaleBy(scalex,insertPoint);
alignpoint=alignpoint.rotateBy(fwj,vet,insertPoint);
pAtt->setTextString(Text1.GetBuffer(Text2.GetLength()));
pAtt->setRotation(PI/2+fwj);
pAtt->setHorizontalMode(AcDb::kTextCenter);
pAtt->setVerticalMode(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.asVector();
AcGeVector3d vet(0,0,1);
alignpoint=alignpoint.scaleBy(scalex,insertPoint);
alignpoint=alignpoint.rotateBy(fwj,vet,insertPoint);
pAtt->setTextString(Text2.GetBuffer(Text2.GetLength()));
pAtt->setRotation(PI/2+fwj);
pAtt->setHorizontalMode(AcDb::kTextCenter);
pAtt->setVerticalMode(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.asVector();
AcGeVector3d vet(0,0,1);
alignpoint=alignpoint.scaleBy(scalex,insertPoint);
alignpoint=alignpoint.rotateBy(fwj,vet,insertPoint);
pAtt->setTextString(Text3.GetBuffer(Text3.GetLength()));
pAtt->setRotation(fwj);
pAtt->setHorizontalMode(AcDb::kTextCenter);
pAtt->setVerticalMode(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::eInvalidInput;
}
pline=AcDbPolyline::cast(pObject);
int num=pline->numVerts();
for (int i=0; i< num; i++)
{
AcGePoint3d temPt;
if((es=pline->getPointAt(i, temPt))!=Acad::eOk)
{
pObject->close();
return Acad::eInvalidInput;
}
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=acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite))!=Acad::eOk)
{
return es;
}
AcDbObjectId groupId;
es=pGroupDict->getAt(groupname,groupId);
if(es==Acad::eInvalidKey)
{
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);
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));
}



void 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,acdbHostApplicationServices()->workingDatabase());
if(pDict)
{
AcDbXrecord *pXrec;
pDict->getAt(xrecordName, (AcDbObject*&) pXrec,AcDb::kForRead);
pDict->close();
struct resbuf *pRbList;
pXrec->rbChain(&pRbList);
pXrec->close();
message=pRbList->resval.rstring;
acutRelRb(pRbList);
return Acad::eOk;
}
else
{
return Acad::eInvalidInput;
}
}


//**********************扩展记录操作(2002.12.12)***************//
//****************打开扩展记录为写******************************//
//**************************************************************//
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;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-20 09:12:48 | 显示全部楼层
好,建议版主加分!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-24 12:47:38 | 显示全部楼层
下载工具后请多提意见,有待升级再无偿提供
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-25 20:49:37 | 显示全部楼层
核心代码值得学习.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-27 21:21:54 | 显示全部楼层
谢谢了,对我来说很多值得学习的地方,能直接用你的代码吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-28 13:09:39 | 显示全部楼层
本着共同进步,欢迎大家使用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-29 13:55:07 | 显示全部楼层
8cuo!!建议版主加分~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-3 08:22:21 | 显示全部楼层
谢谢楼上帮我说话
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-11 16:42:48 | 显示全部楼层
建议斑竹重奖!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-12 14:31:56 | 显示全部楼层
你在定义AcArray处有一错误,应定义为AcArray <CString >&layname;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-14 22:23:46 | 显示全部楼层
谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-14 22:39:24 | 显示全部楼层
我也用用试试,先谢谢共享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-15 22:41:53 | 显示全部楼层
能把源代码提供出来吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 14:05 , Processed in 0.397972 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表