📄 compublic.cpp
字号:
return 0;
}
if (pBlockTable->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭块表!\n");
pBlockTableRecord->close();
pArc->close();
return 0;
}
if (pBlockTableRecord->appendAcDbEntity(arcId, pArc) != Acad::eOk) {
ads_printf("\n错误:无法填加实体至数据库!\n");
pBlockTableRecord->close();
pArc->close();
return 0;
}
pArc->setColorIndex(col);
pArc->setLayer(layname);
if (pBlockTableRecord->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭符号表!\n");
pArc->close();
return 0;
}
//===========加扩展数据===========
pArc->upgradeOpen();
if (pArc->setXData(xData) != Acad::eOk){
ads_printf("\n警告: 实体(圆弧 ID=%d)添加扩展数据时出错!\n",arcId);
pArc->close();
return arcId;
}
//================================
pArc->close();
}
else {
ads_point ptTemp1,ptTemp2, pt1, pt2;
if (endAngle < startAngle) endAngle += PI * 2;
ads_polar(pt, startAngle, r - GetScreenH() / 60, pt1);
ads_polar(pt, startAngle, r + GetScreenH() / 60, pt2);
ads_grdraw(pt1, pt2, 256, 0);
ads_polar(pt, endAngle, r - GetScreenH() / 60, pt1);
ads_polar(pt, endAngle, r + GetScreenH() / 60, pt2);
ads_grdraw(pt1, pt2, 256, 0);
for (i = startAngle; i < endAngle ; i += 0.1) {
ads_polar(pt,i,r,ptTemp1);
if (i != startAngle) ads_grdraw(ptTemp1,ptTemp2,256,0);
Cpoint(ptTemp2,ptTemp1);
}
ads_polar(pt, endAngle, r, ptTemp1);
ads_grdraw(ptTemp1,ptTemp2,256,0);
}
return arcId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 区域填充
//| FillInRegion()
//|
//| 输入参数: int No 区域点的个数
//| ads_point pt[] 区域各点的坐标
//| int color 颜色
//| double Scale 比率
//| char *lpszPatternName 样式
//| char *strLayerName 层名
//| struct resbuf *xData 附加扩展数据
//|
//| 返回: AcDbObjectId
//| 说明: 指定层及区域的各点坐标,在区域中按指定样式和颜色填充
//| 举例: 略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId FillInRegion(AcGePoint3dArray pt,int color,double Scale,char *lpszPatternName,
char *strLayerName,struct resbuf *xData)
{
int No;
AcGePoint2d temp;
AcDbObjectId FillId;
No = pt.logicalLength();
AcGePoint2dArray External;
for (int j = 0; j < No; j++) {
temp.set(pt[j][0],pt[j][1]);
External.append(temp);
} //填加区域点
AcDbHatch * pHatch = new AcDbHatch;//创建图案填充对象
AcDbBlockTable *pBlockTable;
if (acdbCurDwg()->
getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
ads_printf("\n错误:无法打开块表!\n");
pHatch->close();
return 0;
}
AcDbBlockTableRecord *pBlockTableRecord;
if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite) != Acad::eOk) {
ads_printf("\n错误:无法获取符号表!\n");
pBlockTable->close();
return 0;
}
if (pBlockTable->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭块表!\n");
pBlockTableRecord->close();
return 0;
}
AcGeVector3d normal(0.0,0.0,1.0);
pHatch -> setNormal(normal); //设置法线适量
pHatch -> setElevation(0.5); //设置绘图标高
pHatch -> setAssociative(Adesk::kTrue);
pHatch -> setPatternScale(Scale); //设置缩放比例
pHatch -> setPattern(AcDbHatch::kPreDefined,lpszPatternName); //设置填充图案
pHatch -> setHatchStyle(AcDbHatch::kNormal); //设置填充样式
pHatch -> setColorIndex(color); //设置剖面线颜色
pHatch -> setLayer(strLayerName); //设置所在图图层
AcGeDoubleArray vertexBulges;
vertexBulges.setPhysicalLength(0).setLogicalLength(No);
for (int i = 0 ;i < No ;i++) vertexBulges[i] = 0.0; //清零
//边界生成:外边界
if (pHatch->appendLoop(AcDbHatch::kExternal, External, vertexBulges) != Acad::eOk) {
ads_printf("\n错误:无法形成填充外边界!\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
if (pHatch -> evaluateHatch() != Acad::eOk) { //用设定的剖面线样式填充
ads_printf("\n错误:无法用设定的剖面线样式填充!\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
if (pBlockTableRecord->appendAcDbEntity(FillId, pHatch) != Acad::eOk) {
ads_printf("\n错误:无法将填充实体填加至数据库中!\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
if (pBlockTableRecord->close() != Acad::eOk) { //将AcDbHatch对象添加到数据库中
ads_printf("\n错误:无法关闭符号表!\n");
pHatch->close();
return 0;
}
//===========加扩展数据===========
pHatch->upgradeOpen();
if (pHatch->setXData(xData) != Acad::eOk){
ads_printf("\n警告: 实体(填充对象 ID=%d)添加扩展数据时出错!\n",FillId);
}
//================================
pHatch->close();
return FillId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 区域填充
//| FillInRegionEx()
//|
//| 输入参数: int No 区域点的个数
//| ads_point pt[] 区域各点的坐标
//| int color 颜色
//| double Scale 比率
//| char *lpszPatternName 样式
//| char *strLayerName 层名
//| struct resbuf *xData 附加扩展数据
//|
//| 返回: AcDbObjectId
//| 说明: 指定层及区域的各点坐标,在区域中按指定样式和颜色填充
//| 举例: 略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId FillInRegionEx(int No, ads_point pt[],int color,double Scale,char *lpszPatternName,
char *strLayerName,struct resbuf *xData)
{
AcGePoint2d temp;
AcDbObjectId FillId;
AcGePoint2dArray External;
for (int j = 0; j < No; j++) {
temp.set(pt[j][0],pt[j][1]);
External.append(temp);
} //填加区域点
AcDbHatch * pHatch = new AcDbHatch;//创建图案填充对象
AcDbBlockTable *pBlockTable;
if (acdbCurDwg()->
getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
ads_printf("\n错误:无法打开块表!\n");
pHatch->close();
return 0;
}
AcDbBlockTableRecord *pBlockTableRecord;
if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite) != Acad::eOk) {
ads_printf("\n错误:无法获取符号表!\n");
pBlockTable->close();
return 0;
}
if (pBlockTable->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭块表!\n");
pBlockTableRecord->close();
return 0;
}
AcGeVector3d normal(0.0,0.0,1.0);
pHatch -> setNormal(normal); //设置法线适量
pHatch -> setElevation(0.5); //设置绘图标高
pHatch -> setAssociative(Adesk::kTrue);
pHatch -> setPatternScale(Scale); //设置缩放比例
pHatch -> setPattern(AcDbHatch::kPreDefined,lpszPatternName); //设置填充图案
pHatch -> setHatchStyle(AcDbHatch::kNormal); //设置填充样式
pHatch -> setColorIndex(color); //设置剖面线颜色
pHatch -> setLayer(strLayerName); //设置所在图图层
AcGeDoubleArray vertexBulges;
vertexBulges.setPhysicalLength(0).setLogicalLength(No);
for (int i = 0 ;i < No ;i++) vertexBulges[i] = 0.0; //清零
//边界生成:外边界
if (pHatch->appendLoop(AcDbHatch::kExternal, External, vertexBulges) != Acad::eOk) {
ads_printf("\n错误:无法形成填充外边界!\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
if (pHatch -> evaluateHatch() != Acad::eOk) { //用设定的剖面线样式填充
ads_printf("\n错误:无法用设定的剖面线样式填充!\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
if (pBlockTableRecord->appendAcDbEntity(FillId, pHatch) != Acad::eOk) {
ads_printf("\n错误:无法将填充实体填加至数据库中!\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
if (pBlockTableRecord->close() != Acad::eOk) { //将AcDbHatch对象添加到数据库中
ads_printf("\n错误:无法关闭符号表!\n");
pHatch->close();
return 0;
}
//===========加扩展数据===========
pHatch->upgradeOpen();
if (pHatch->setXData(xData) != Acad::eOk){
ads_printf("\n警告: 实体(填充对象 ID=%d)添加扩展数据时出错!\n",FillId);
}
//================================
pHatch->close();
return FillId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 环形填充
//| AnnulusFillIn()
//|
//| 输入参数: ads_point pt 环形圆心
//| double r1 外环半径
//| double r2 内环半径
//| int color 颜色
//| double Scale 比率
//| char *lpszPatternName 样式
//| char *strLayerName 层名
//| struct resbuf *xData 附加扩展数据
//|
//| 返回: AcDbObjectId
//| 说明: 指定层及区域的各点坐标,在区域中按指定样式和颜色填充
//| 举例: 略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId FillInAnnulus(ads_point pt,double r1,double r2,int color,double Scale,
char *lpszPatternName,char *strLayerName,struct resbuf *xData)
{
AcDbObjectId FillId;
AcGePoint2d cenPt(pt[0], pt[1]);
AcGeCircArc2d *cirArc1 = new AcGeCircArc2d();
AcGeCircArc2d *cirArc2 = new AcGeCircArc2d();
cirArc1->setCenter(cenPt);
cirArc1->setRadius(r1);
cirArc1->setAngles(0.0, 2 * PI);
cirArc2->setCenter(cenPt);
cirArc2->setRadius(r2);
cirArc2->setAngles(0.0,2 * PI);
AcDbHatch * pHatch = new AcDbHatch;//创建图案填充对象
AcDbBlockTable *pBlockTable;
if (acdbCurDwg()->
getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
ads_printf("\n错误:无法打开块表!\n");
return 0;
}
AcDbBlockTableRecord *pBlockTableRecord;
if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite) != Acad::eOk) {
ads_printf("\n错误:无法获取符号表\n");
pBlockTable->close();
return 0;
}
if (pBlockTable->close() != Acad::eOk) {
ads_printf("\n错误:无法关闭块表\n");
return 0;
}
AcGeVector3d normal(0.0,0.0,1.0);
pHatch -> setNormal(normal); //设置法线适量
pHatch -> setElevation(0.5); //设置绘图标高
pHatch -> setAssociative(Adesk::kTrue);
pHatch -> setPatternScale(Scale); //设置缩放比例
pHatch -> setPattern(AcDbHatch::kPreDefined,lpszPatternName); //设置填充图案
pHatch -> setHatchStyle(AcDbHatch::kNormal); //设置填充样式
AcGeIntArray edgeTypes1,edgeTypes2;
AcGeVoidPointerArray edgePtrs1,edgePtrs2;
//建立填充区域
edgeTypes1.append(AcDbHatch::kCirArc);
edgeTypes2.append(AcDbHatch::kCirArc);
edgePtrs1.append((void*)cirArc1);
edgePtrs2.append((void*)cirArc2);
//区域并合计算
if (pHatch->appendLoop(AcDbHatch::kExternal, edgePtrs1, edgeTypes1) != Acad::eOk) { //加
ads_printf("\n错误:无法创建外边界\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
if (pHatch->appendLoop(AcDbHatch::kDefault, edgePtrs2, edgeTypes2) != Acad::eOk) { //减
ads_printf("\n错误:无法创建内边界\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
//区域形成
if (pHatch->evaluateHatch() != Acad::eOk) {
ads_printf("\n错误:无法形成填充区域\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
pHatch -> setColorIndex(color); //设置剖面线颜色
pHatch -> setLayer(strLayerName); //设置所在图图层
if (pBlockTableRecord->appendAcDbEntity(FillId, pHatch) != Acad::eOk) {
ads_printf("\n错误:无法将实体填加至数据库\n");
pBlockTableRecord->close();
pHatch->close();
return 0;
}
if (pBlockTableRecord->close() != Acad::eOk) { //将AcDbHatch对象添加到数据库中
ads_printf("\n错误:无法关闭块表\n");
pHatch->close();
return 0;
}
//===========加扩展数据===========
pHatch->upgradeOpen();
if (pHatch->setXData(xData) != Acad::eOk){
ads_printf("\n警告: 实体(填充对象 ID=%d)添加扩展数据时出错!\n",FillId);
}
//================================
pHatch->close();
return FillId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 自定义填充(求Region区域扣除Circle)
//| DefineFillIn1()
//|
//| 输入参数: int No Region区域顶点各数
//| ads_point pt[] Region区域各顶点坐标
//| ads_point ptC 圆心坐标
//| double r1 半径
//| int color 颜色
//| double Scale 比率
//| char *lpszPatternName 样式
//| char *strLayerName 层名
//| struct resbuf *xData 附加扩展数据
//|
//| 返回: AcDbObjectId
//| 说明: Region中扣除circle的区域填充;pt[0]和pt[No-2]为两
//| 区域的公共交点坐标
//| 举例: 略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId FillInDefine1(int No, ads_point pt[],ads_point ptC,double r1,int color,double Scale,
char *lpszPatternName,char *strLayerName,struct resbuf *xData)
{
AcDbObjectId FillId;
ads_point ptmp,ptmp1;
double aa;
AcGePoint2d temp,temp1;
AcGePoint2dArray External,External1;
for (int j = 0; j < No; j++) {
temp.set(pt[j][0],pt[j][1]);
External.append(temp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -