📄 stdafx.cpp
字号:
// stdafx.cpp : source file that includes just the standard includes
// MFCTemplate.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
// Check if the build is DEBUG version and it's intended
// to be used with Non-DEBUG AutoCAD.
// In this case, for MFC header files, we need to undefine
// _DEBUG symbol
// Read this project readme.txt for more detail
#if defined( _DEBUG) && !defined(DEBUG_AUTOCAD)
#pragma message("Building debug version of dynamic.arx to be used with non-debug/Prod AutoCAD")
#define _DEBUG_WAS_DEFINED
#undef _DEBUG
#endif
#include "stdafx.h"
#ifdef _DEBUG_WAS_DEFINED
#define _DEBUG
#undef _DEBUG_WAS_DEFINED
#endif
BOOL MakeNewLayer(char* LayerName,int clor);
AcDbObjectId MakePoint(ads_point Pt1,char* layname);
AcDbObjectId MakeCircle(ads_point pt,double r,int col,char* layname);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 创建新图层
//| MakeNewLayer()
//|
//| 输入参数: char* LayerName 创建图层名称
//| int clor 层颜色
//| char *cLineFile 线型文件
//| char* cLineType 线型名
//| 返回: BOOL
//| 说明: 创建新层
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL MakeNewLayer(char* LayerName,int clor)
{
//1.获取数据库中指向有名层表指针
AcDbLayerTable *pLayerTable;
if (acdbCurDwg()->getLayerTable(pLayerTable,AcDb::kForWrite) != Acad::eOk) {
pLayerTable->close();//关闭层表指针
return FALSE;
}
//2.建立一个新的层表
AcDbObjectId ltypeObjId;
if (!pLayerTable->has(LayerName)) {
AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;
pLayerTableRecord->setName(LayerName);
AcCmColor color; //定义层表颜色
color.setColorIndex(clor);
pLayerTableRecord->setColor(color);
if (pLayerTable->add(pLayerTableRecord) !=Acad::eOk) {
pLayerTable->close();
pLayerTableRecord->close();
return FALSE;
}
pLayerTable->close(); //关闭层表指针
pLayerTableRecord->close();
}
else {
pLayerTable->close();
return 0;
}
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 绘制点
//| MakePoint()
//| 输入参数: ads_point Pt1 点位置
//| char* layname 所在层
//| 返回: AcDbObjectId
//| 说明: 指定层名,建立点实体
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakePoint(ads_point Pt1,char* layname)
{
AcDbObjectId PointId;
AcGePoint3d Pt((double)Pt1[0],(double)Pt1[1], (double)Pt1[2]);
AcDbPoint *pPoint = new AcDbPoint(Pt);
AcDbBlockTable *pBlockTable;
if (acdbCurDwg()->getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
ads_printf("\n错误:无法打开块表!\n");
pPoint->close();
return 0;
}
AcDbBlockTableRecord *pBlockTableRecord;
if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite) != Acad::eOk) {
ads_printf("\n错误:无效块表!\n");
pBlockTable->close();
pPoint->close();
return 0;
}
if (pBlockTable->close() != Acad::eOk) {
ads_printf("\n错误:不能关闭块表!\n");
return 0;
}
if (pBlockTableRecord->appendAcDbEntity(PointId, pPoint) != Acad::eOk) {
ads_printf("\n错误:不能填加实体至数据库!");
pPoint->close();
return 0;
}
if (pBlockTableRecord->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭符号表!\n");
pPoint->close();
return 0;
}
pPoint->setLayer(layname);
pPoint->close();
return PointId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 绘制圆
//| MakeCircle()
//|
//| 输入参数: ads_point pt 圆心坐标
//| double r 半径
//| int col 颜色
//| char* layname 所在层名
//| struct resbuf *xData 附加扩展数据
//| BOOL draw 是否绘制
//|
//| 返回: AcDbObjectId
//| 说明: 指定层、圆心,半径、颜色、建立圆
//| 举例: 略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakeCircle(ads_point pt,double r,int col,char* layname)
{
AcDbObjectId circleId;
AcGePoint3d center((double)pt[0],(double)pt[1],(double)pt[2]);
AcGeVector3d normal(0.0,0.0,1.0);
AcDbCircle *pCirc = new AcDbCircle(center,normal,r);
AcDbBlockTable *pBlockTable;
if (acdbCurDwg()->getBlockTable(pBlockTable,
AcDb::kForRead) != Acad::eOk) {
ads_printf("\n错误:无法打开块表!\n");
pCirc->close();
return 0;
}
AcDbBlockTableRecord *pBlockTableRecord;
if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite) != Acad::eOk) {
ads_printf("\n错误:无法获取符号表!\n");
pBlockTable->close();
pCirc->close();
return 0;
}
if (pBlockTable->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭块表!\n");
pBlockTableRecord->close();
pCirc->close();
return 0;
}
if (pBlockTableRecord->appendAcDbEntity(circleId, pCirc) != Acad::eOk) {
ads_printf("\n错误:无法填加实体至数据库!\n");
pBlockTableRecord->close();
pCirc->close();
return 0;
}
pCirc->setColorIndex(col);
pCirc->setLayer(layname);
if (pBlockTableRecord->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭符号表!\n");
pCirc->close();
return 0;
}
pCirc->close();
return circleId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 文字输出
//| MakeText()
//|
//| 输入参数: ads_point pt 基点坐标
//| AcDb::TextHorzMode hm 水平对齐方式
//| AcDb::TextVertMode vm 垂直对齐方式
//| char* Testr 输出的文字
//| char* Style 文字样式
//| char* laname 层名
//| double th 字高
//| double Scale 字宽比递率
//| int color 颜色
//| double angle 角度
//| struct resbuf *xData 附加扩展数据
//| BOOL draw 是否绘制
//| 返回: AcDbObjectId
//| 说明: 略
//|
//| 举例: 略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakeText(ads_point pt,char* Testr,char* laname)
{
AcGePoint3d ptt;
AcDbObjectId styleId;
AcDbObjectId entityId;
AcDbTextStyleTable *pTextStyleTbl;
ptt.set(pt[0],pt[1],pt[2]);
if (acdbCurDwg()->
getTextStyleTable(pTextStyleTbl,AcDb::kForRead) != Acad::eOk) {
ads_printf("\n错误:无法打开块表!\n");
pTextStyleTbl->close();
return 0;
}
if (pTextStyleTbl->getAt("standard",styleId) != Acad::eOk) {
/* ads_printf("\n警告:指定的字体样式无效!\n");
pTextStyleTbl->close();
return 0;*/
}
if (pTextStyleTbl->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭文字样式表!\n");
return 0;
}
AcGePoint3d loText(pt[0],pt[1],pt[2]); //文字定位点
AcDbText *pText = new AcDbText(loText,Testr,styleId,1.5,0.0);
AcDbBlockTable *pBlockTable;
if (acdbCurDwg()->
getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
ads_printf("\n错误:打开模型空间块表出错!\n");
pText->close();
return 0;
}
AcDbBlockTableRecord *pBlockRecord;
if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockRecord,
AcDb::kForWrite) != Acad::eOk) {
ads_printf("\n错误:获取模型空间块表出错!\n");
pBlockTable->close();
pText->close();
return 0;
}
if (pBlockTable->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭块表!\n");
pText->close();
return 0;
}
if (pText->setHorizontalMode(AcDb::kTextLeft) != Acad::eOk) {pText->close();return 0;} //设定文字水平对齐方式
if (pText->setVerticalMode(AcDb::kTextBottom) != Acad::eOk) {pText->close();return 0;} //设定文字垂直对齐方式
if (pText->setAlignmentPoint(ptt) != Acad::eOk) {pText->close();return 0;} //设定基点坐标
if (pText->setLayer(laname) != Acad::eOk) {pText->close();return 0;} //所在层
if (pText->setColorIndex(3) != Acad::eOk) {pText->close();return 0;} //颜色
if (pText->setWidthFactor(0.8)!= Acad::eOk) {pText->close();return 0;} //设定文字比例
if (pBlockRecord->appendAcDbEntity(entityId,pText) != Acad::eOk) {
ads_printf("\n错误:填加文字实体出错!\n");
pText->close();
return 0;
}
if (pBlockRecord->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭符号表!\n");
pText->close();
return 0;
}
pText->close();
return entityId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 绘制PLine线
//| MakePline()
//|
//| 输入参数: AcGePoint3dArray ptArr 坐标数组
//| char* lay 所在层
//| double wid 线宽
//| int col 颜色
//| struct resbuf *xData 附加扩展数据
//| BOOL draw 是否绘制
//|
//| 返回: AcDbObjectId
//| 说明: 指定层名,建立PLine线
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakePline(AcGePoint3dArray ptArr,char* lay,double wid,int col,BOOL draw)
{
int i;
AcDbObjectId PlineId;
if (draw) {
AcDb3dPolyline *pLine = new AcDb3dPolyline(AcDb::k3dSimplePoly ,
ptArr);
AcDbBlockTable *pBlockTable;
if (acdbCurDwg()->
getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
ads_printf("\n错误:无法打开块表!\n");
pLine->close();
return 0;
}
AcDbBlockTableRecord *pBlockTableRecord;
if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite) != Acad::eOk) {
ads_printf("\n错误:无法获取符号表!\n");
pBlockTable->close();
pLine->close();
return 0;
}
if (pBlockTable->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭块表!\n");
pBlockTableRecord->close();
pLine->close();
return 0;
}
pLine->setColorIndex(col);
if (pLine->makeOpen() != Acad::eOk) {
ads_printf("\n错误:无法编辑PLine线!\n");
pBlockTableRecord->close();
pLine->close();
return 0;
}
pLine->setLayer(lay);
//将对象添加到数据库中
if (pBlockTableRecord->appendAcDbEntity(PlineId,pLine) != Acad::eOk) {
ads_printf("\n错误:无法填加实体至数据库!\n");
pBlockTableRecord->close();
pLine->close();
return 0;
}
if (pBlockTableRecord->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭符号表!\n");
pLine->close();
return 0;
}
pLine->close();
}
else {
int n = ptArr.length();
ads_printf("*%d\n",n);
ads_point poFrom,poTo;
for (i = 0; i < n - 1; i++) {
if (i < n - 1) {
Spoint(poFrom, ptArr[i][0], ptArr[i][1], 0.0);
Spoint(poTo, ptArr[i + 1][0],ptArr[i + 1][1], 0.0);
ads_grdraw(poFrom,poTo,col,0);
}
}
}
return PlineId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 实数转化为字符串
//| RtoS()
//| 输入参数: double rNumber 数字
//| int iUnit 标志位
//| int iPrec 精度(保留几位小数)
//| 返回: char*
//| 说明: 略
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char *RtoS (double rNumber,int iUnit,int iPrec)
{
char strTmp[20],*strRe;
if(ads_rtos(rNumber,iUnit,iPrec,strTmp) != RTNORM) return " ";
strRe = (char *) malloc (strlen (strTmp)+1);
if (strRe == NULL) {
ads_printf ("\n错误:内存不足!\n") ;
return " ";
}
strcpy(&strRe[0],strTmp);
return strRe;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -