OdDbBlockReference怎么判断DWG图形记录数据是属于模型空间还是图纸空间

zlc409057173 2016-07-22 05:26:39
请教大神,最近在项目中遇到一个问题,有没有懂java用到Teigha第三方插件的大神,,我只想取到模型空间的数据,代码如下,但是这样将图形里面的数据也取出来了,所以想请问有没有大神知道,有没有一个标识区分是模型空间的还是图形空间的数据
public List<String> getDwgBlockData(String fileName,String storeCode,String ifpVersion
,MemoryManager mMan,MemoryTransaction mStartTrans,ExSystemServices systemServices,ExHostAppServices appServices){
/********************************************************************/
/* Create a Service and HostApp instances. */
/********************************************************************/
/* ExSystemServices systemServices = new ExSystemServices();
ExHostAppServices appServices = new ExHostAppServices();
appServices.disableOutput(true); //Disable progress meter
*/ /********************************************************************/
/* Initialize Teigha. */
/********************************************************************/
TD_Db.odInitialize(systemServices);
MemoryTransaction mTrans1 = mMan.StartTransaction();
//block数据集合
List<String> dataList=new ArrayList<String>();
List<String> blockIdList=new ArrayList<String>();
boolean isUpdateBlkId=false;
if(fileName!=null){
OdDbDatabase localOdDbDatabase = null;
try {
if (!appServices.findFile(fileName).isEmpty()) {
localOdDbDatabase = appServices.readFile(fileName);
if (localOdDbDatabase != null) {
OdDbBlockTable pTable = (OdDbBlockTable) localOdDbDatabase.getBlockTableId().safeOpenObject(OpenMode.kForWrite, false);
OdDbBlockTableIterator localIterator = (OdDbBlockTableIterator) pTable.newIterator();
int i = 0,s = 0;
for (localIterator.start(); !localIterator.done(); localIterator.step()) {
i++;
OdDbBlockTableRecord blkRecord=(OdDbBlockTableRecord) localIterator.getRecord(OpenMode.kForWrite);
OdDbObjectIdArray objArr=new OdDbObjectIdArray();
blkRecord.getBlockReferenceIds(objArr);
Iterator<OdDbObjectId> objIt=objArr.iterator();
int j = 0 , k = 0;
while(objIt.hasNext()){
OdDbBlockReference ref=(OdDbBlockReference) objIt.next().safeOpenObject(OpenMode.kForWrite);
BlockBean blkData=this.getBlockData(fileName,ref,storeCode.trim(),ifpVersion,blockIdList);

j++;
if(blkData!=null){
blockIdList.add(blkData.getFixtureBlockId());
dataList.add(blkData.toString());
k++;
if(blkData.getIsUpdateBlkId()!=null&&blkData.getIsUpdateBlkId()){
isUpdateBlkId=true;
}
}
}
s +=k;
System.out.println("i:" + i + ", j:" + j + ", k:" + k);
}
System.out.println("ROWS:" + i +" count:"+s);
if(isUpdateBlkId){
MemoryTransaction mTr = mMan.StartTransaction();
saveDwgFile(fileName,localOdDbDatabase,storeCode);
mMan.StopTransaction(mTr);
}
}
}

} catch (Exception e) {
String errorMsg="read file error in export csv action->"+fileName+",Please check";
System.err.println(errorMsg);
LogUtil.writeLog(errorMsg+LogUtil.getErrorInfoFromException(e),MessageBean.ERROR);
}

}
//添加block tableHeader
dataList.add(getCsvHead().toString());

mMan.StopTransaction(mTrans1);
/* mMan.StopTransaction(mStartTrans);
TD_Db.odUninitialize();*/
return dataList;
}
...全文
386 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlc409057173 2016-07-26
  • 打赏
  • 举报
回复
We are use java api. When we open DWG and use BATTMAN to open block attribute manager, we found a block: 61W07.220.100.350 Found in drawing:13, Found in model space:0 And when use JAVA api, we still found block: 61W07.220.100.350 related data show in data list. And we tried to export csv by using AutoCAD, found block 61W07.220.100.350 related data NOT show in csv. My question is: is there any method to filter these kind of block not show in data list when using JAVA api. That is to say, only want to get the data list, numbering refer to ‘Found in model space’ not ‘found in drawing’. Attached is DWG and JAVA code.

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧