- UID
- 33023
- 积分
- 157
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-3-3
- 最后登录
- 1970-1-1
|
发表于 2004-7-24 09:21:07
|
显示全部楼层
第一页顶函数中AcDbLayerTableRecordPointer是何类?是否应为AcDbLayerTableRecord *
贴上开发项目中的部分代码
#include "StdAfx.h"
#include "StdArx.h"
//#include ".\pmtDBX\PFGpmtinit.h"
#include <dbsymtb.h>
#include <math.h>
#include "CommonUtils.h"
//命名对象词典中无所需生成的词典(dictName)时生成词典,当DdictName存在时直接返回
void createDictionary(char *dictName)
{
AcDbDictionary *pNameDict;
acdbHostApplicationServices()->workingDatabase()->
getNamedObjectsDictionary(pNameDict, AcDb::kForWrite);
AcDbDictionary *pDict;
if (pNameDict->getAt(dictName, (AcDbObject*&) pDict,
AcDb::kForWrite) == Acad::eKeyNotFound)
{
pDict = new AcDbDictionary;
AcDbObjectId DictId;
pNameDict->setAt(dictName, pDict, DictId);
}
pNameDict->close();
pDict->close();
}
//将自定义对象pObj加入词典dictName,对象名为objectName。词典dictName不存在时,调用creatDictionary()生成。
void addObjectToDict(AcDbObject *pObj,char *objectName,char *dictName)
{
createDictionary(dictName);
AcDbDictionary *pNamedobj;
acdbHostApplicationServices()->workingDatabase()
->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead);
Acad::ErrorStatus es;
AcDbDictionary *pDict;
es=pNamedobj->getAt(dictName, (AcDbObject*&)pDict,
AcDb::kForWrite);
pNamedobj->close();
if (es==Acad::eOk) //使用if(pDict)不能起到判断的作用。
{
// add new objects to the dictionary,
// then close them.
AcDbObjectId rId1;
pDict->setAt(objectName, pObj, rId1);
pDict->close(); //不能放在该处{}之外,即未能正常获取,就无所谓关闭,否则出错。
}
// pDict->close();
}
//根据CAD两点坐标及对应的大地坐标(经纬距)计算两坐标系的夹角angle及比例转换系数K
//计算大地坐标系原点在CAD世界坐标系中的原点坐标earthorg
//函数return夹角,其单位为弧度
float EonAndXoyAngle(ads_point cadPt1,ads_point cadPt2,ads_point earthPt1,ads_point earthPt2,double &k,ads_point &earthOrg)
{
float angle;
double n,e,x,y;
float ax,ae;
n=(earthPt2[Y]-earthPt1[Y]);
e=(earthPt2[X]-earthPt1[X]);
x=(cadPt2[X]-cadPt1[X]);
y=(cadPt2[Y]-cadPt1[Y]);
k=sqrt((n*n+e*e)/(x*x+y*y));
ax=atan2(y,x); //线段与X轴的夹角
ae=atan2(n,e); //线段与E轴的夹角
angle=(ax-ae);
earthOrg[X]=cadPt1[X]-(cos(angle)*earthPt1[X]-sin(angle)*earthPt1[Y])/k;
earthOrg[Y]=cadPt1[Y]-(cos(angle)*earthPt1[Y]+sin(angle)*earthPt1[X])/k;
return angle;
}
//将CAD坐标转换为大地坐标
void xyToEn(ads_point cadPt,ads_point& earthPt,ads_point earthOrg,float angle, double k)
{
earthPt[X]=k*(cos(angle)*(cadPt[X]-earthOrg[X])+sin(angle)*(cadPt[Y]-earthOrg[Y]));
earthPt[Y]=k*(-sin(angle)*(cadPt[X]-earthOrg[X])+cos(angle)*(cadPt[Y]-earthOrg[Y]));
}
//将大地坐标转换为CAD坐标
void enToXY(ads_point earthPt,ads_point& cadPt,ads_point earthOrg,float angle, double k)
{
cadPt[X]=earthOrg[X]+(cos(angle)*earthPt[X]-sin(angle)*earthPt[Y])/k;
cadPt[Y]=earthOrg[Y]+(cos(angle)*earthPt[Y]+sin(angle)*earthPt[X])/k;
}
// 判定当前图形中有无给定块名的块表记录,有返回true、同时返回其id,
//否则返回flase
bool existBlock(char* pBlockName,AcDbObjectId &blockId)
{
AcDbBlockTable* pBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable,AcDb::kForRead);
if(pBlockTable->has(pBlockName))
{
pBlockTable->getAt(pBlockName,blockId);
pBlockTable->close();
return true;
}
else
{
pBlockTable->close();
return false;
}
}
// 把一图形文件dwg插入当前图形作为一块,并给予块名。若有同名块就不再插入。
bool insertDwgToCurDwg(char* pFullPathFile,char* pBlockName,AcDbObjectId &blockId)
{
AcDbDatabase *pNewDb,*pCurDb;
Acad::ErrorStatus es;
if(existBlock(pBlockName,blockId))
{
return true;
}
pNewDb=new AcDbDatabase(Adesk::kFalse);
es=pNewDb->readDwgFile(pFullPathFile, _SH_DENYNO,false);
if (es!=Acad::eOk)
{
acutPrintf("读文件错");
delete pNewDb;
return false;
}
pCurDb =acdbHostApplicationServices()->workingDatabase();
if((es=pCurDb->insert(blockId, pBlockName,pNewDb, true))==Acad::eOk)
{
delete pNewDb;
return true;
}
else
{
delete pNewDb;
return false;
}
} |
|