明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8971|回复: 13

[图形系统] 怎么让预览的图案变大

  [复制链接]
发表于 2009-5-12 10:33:00 | 显示全部楼层 |阅读模式

实现dwg的文件块在窗体上预览

一,使用块浏览器对象blockthumbnailhelper来预览

二,使用插件DwgThumbnail来实现

三,是使用网上提供的下面的代码来实现

class ViewDWG
    {
        struct BITMAPFILEHEADER
        {
            public short bfType;
            public int bfSize;
            public short bfReserved1;
            public short bfReserved2;
            public int bfOffBits;
        }
        public static Image GetDwgImage(string FileName)
        {
            if (!(File.Exists(FileName)))
            {
                throw new FileNotFoundException("文件没有被找到");
            }
            FileStream DwgF;  //文件流
            int PosSentinel;  //文件描述块的位置
            BinaryReader br;  //读取二进制文件
            int TypePreview;  //缩略图格式
            int PosBMP;       //缩略图位置
            int LenBMP;       //缩略图大小
            short biBitCount; //缩略图比特深度
            BITMAPFILEHEADER biH; //BMP文件头,DWG文件中不包含位图文件头,要自行加上去
            byte[] BMPInfo;       //包含在DWG文件中的BMP文件体
            MemoryStream BMPF = new MemoryStream(); //保存位图的内存文件流
            BinaryWriter bmpr = new BinaryWriter(BMPF); //写二进制文件类
            Image myImg = null;
            try
            {
                DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read);   //文件流
                br = new BinaryReader(DwgF);
                DwgF.Seek(13, SeekOrigin.Begin); //从第十三字节开始读取
                PosSentinel = br.ReadInt32();  //第13到17字节指示缩略图描述块的位置
                DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin);  //将指针移到缩略图描述块的第31字节
                TypePreview = br.ReadByte();  //第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式
                if (TypePreview == 1)
                {
                }
                else if (TypePreview == 2 || TypePreview == 3)
                {
                    PosBMP = br.ReadInt32(); //DWG文件保存的位图所在位置
                    LenBMP = br.ReadInt32(); //位图的大小
                    DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); //移动指针到位图块
                    biBitCount = br.ReadInt16(); //读取比特深度
                    DwgF.Seek(PosBMP, SeekOrigin.Begin); //从位图块开始处读取全部位图内容备用
                    BMPInfo = br.ReadBytes(LenBMP); //不包含文件头的位图信息
                    br.Close();
                    DwgF.Close();
                    biH.bfType = 19778; //建立位图文件头
                    if (biBitCount < 9)
                    {
                        biH.bfSize = 54 + 4 * (int)(Math.Pow(2, biBitCount)) + LenBMP;
                    }
                    else
                    {
                        biH.bfSize = 54 + LenBMP;
                    }
                    biH.bfReserved1 = 0; //保留字节
                    biH.bfReserved2 = 0; //保留字节
                    biH.bfOffBits = 14 + 40 + 1024; //图像数据偏移
                    //以下开始写入位图文件头
                    bmpr.Write(biH.bfType); //文件类型
                    bmpr.Write(biH.bfSize);  //文件大小
                    bmpr.Write(biH.bfReserved1); //0
                    bmpr.Write(biH.bfReserved2); //0
                    bmpr.Write(biH.bfOffBits); //图像数据偏移
                    bmpr.Write(BMPInfo); //写入位图
                    BMPF.Seek(0, SeekOrigin.Begin); //指针移到文件开始处
                    myImg = Image.FromStream(BMPF); //创建位图文件对象
                    bmpr.Close();
                    BMPF.Close();
                }
                return myImg;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

以上的方法都可以实现dwg块的预览,显示在窗体上,但都太小了,根本看不请,达不到预览的效果!怎么可以让预览图案便大?要设计缩放吗?

 

好像还有一种可以用autodesk volo view 来实现,好像只支持cad2002一下的版本啊!这一种我还没用过!

请高手给我指导指导,下午之前做不出来,会有麻烦的

 楼主| 发表于 2009-5-12 15:08:00 | 显示全部楼层
有没有知道的?给个思路也行啊
发表于 2009-5-12 17:03:00 | 显示全部楼层

确实很小,我现在是把块图像转成jpg文件然后放到资源里

 楼主| 发表于 2009-5-12 19:43:00 | 显示全部楼层
lzh741206发表于2009-5-12 17:03:00确实很小,我现在是把块图像转成jpg文件然后放到资源里

你把块转成jpg文件,难道你下次就不调用了吗?要是在调用怎么办?
发表于 2009-5-13 14:56:00 | 显示全部楼层
调用什么?
发表于 2009-5-14 11:28:00 | 显示全部楼层
我也遇到这问题,期待那位大大解决
发表于 2009-5-15 21:51:00 | 显示全部楼层
本帖最后由 作者 于 2009-5-16 9:37:03 编辑

这几天收集Kean的专题,无意间发现了这个:
AutoCAD .NET version of the ObjectARX BlockView sample这里有个ObjectArx的解决方案,参考一下吧
总是需要在自定义控件上显示DWG图形,如在一个对话框上动态浏览一个DWG图形,于是写了一个控件,专门用来动态浏览DWG,这个控件从CStatic中派生,运用AcGs类库中的AcGsView,AcGsDevice,AcGsModel来协作显示DWG图形。
从CStatic派生,使用方便,只要在对话框中放一个CStatic,然后把CStatic的对象名换成fcGsPreviewCtrl即可。
  1. fcGsPreviewCtrl.h
  2. /********************************************************************
  3. 日 期: 2007/10/08
  4. 文件 名: fcgspreviewctrl.h
  5. 作 者: Racky Ye
  6. 单 位:
  7. 描 述: 用来预览DWG图形的控件
  8. *********************************************************************/
  9. #ifndef _FC_GS_PREVIEW_CTRL_H__
  10. #define _FC_GS_PREVIEW_CTRL_H__
  11. #if _MSC_VER > 1000
  12. #pragma once
  13. #endif // _MSC_VER > 1000
  14. #include "acgi.h"
  15. #include <math.h>
  16. #include "gs.h"
  17. #include "acgs.h"
  18. #include "acgsmanager.h"
  19. // 用来预览DWG图形的控件
  20. class fcGsPreviewCtrl : public CStatic
  21. {
  22. public:
  23. fcGsPreviewCtrl();
  24. virtual ~fcGsPreviewCtrl();
  25. public:
  26. //函数功能:传入dwg文件即可预览
  27. BOOL Init(LPCTSTR szDwgFile);
  28. //函数功能:传入数据库指针即可预览数据库中的实体
  29. BOOL Init(AcDbDatabase *pDb);
  30. // 缩放到整个图纸可见
  31. void ZoomE();
  32. void Clear();
  33. protected:
  34. void InitGS(HINSTANCE hRes); // 初始化图形系统
  35. BOOL InitInner(AcDbDatabase *pDb); // 内部初始化
  36. bool GetActiveViewPortInfo (ads_real &height, ads_real &width, AcGePoint3d &target,
  37. AcGeVector3d &viewDir, ads_real &viewTwist, bool getViewCenter);
  38. //获得块中的所有实体
  39. void GetAllEnt(const AcDbObjectId& idBlockRec, AcDbObjectIdArray& IDArray);
  40. //获得实体的范围
  41. Acad::ErrorStatus GetEntExtents(const AcDbObjectId& idEnt, AcDbExtents& extents);
  42. void GetEntExtents(const AcDbObjectIdArray& aridEnt, AcDbExtents& extents);
  43. void Mid(const AcGePoint3d& pt1, const AcGePoint3d& pt2, AcGePoint3d& ptMid);
  44. protected:
  45. //{{AFX_MSG(fcGsPreviewCtrl)
  46. afx_msg void OnPaint();
  47. afx_msg void OnSize(UINT nType, int cx, int cy);
  48. afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
  49. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  50. afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
  51. afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
  52. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  53. afx_msg UINT OnNcHitTest(CPoint point);
  54. afx_msg void OnSetFocus(CWnd* pOldWnd);
  55. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  56. //}}AFX_MSG
  57. DECLARE_MESSAGE_MAP()
  58. private:
  59. AcDbExtents m_extents; // 图纸范围
  60. HCURSOR m_hPanCursor; // 移动时的图标
  61. HCURSOR m_hCrossCursor; // 十字图标
  62. HCURSOR m_hOrbitCursor; // 旋转图标
  63. AcGsView *m_pView; // 图形系统中的视图,用来绘制图形的区域
  64. AcGsDevice *m_pDevice; // 图形系统中的设备,
  65. AcGsModel *m_pModel;
  66. bool m_bPanning; // 是否处于移动图形状态
  67. bool m_bOrbiting; // 是否处于旋转图形状态
  68. AcDbDatabase* m_pDb; // 该预览空间绑定的数据库
  69. CPoint m_StartPt; // 移动或旋转时的起点
  70. };
  71. /////////////////////////////////////////////////////////////////////////////
  72. //{{AFX_INSERT_LOCATION}}
  73. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  74. #endif // !defined(_FC_GS_PREVIEW_CTRL_H__)
  75. CPP文件:
  76. /********************************************************************
  77. 日 期: 2007/10/08
  78. 文件 名: fcgspreviewctrl.cpp
  79. 作 者: Racky Ye
  80. 单 位:
  81. 描 述: 用来预览DWG图形的控件
  82. *********************************************************************/
  83. #include "StdAfx.h"
  84. #include "resource.h"
  85. #include "fcGsPreviewCtrl.h"
  86. #include "dbents.h"
  87. #ifdef _DEBUG
  88. #define new DEBUG_NEW
  89. #undef THIS_FILE
  90. static char THIS_FILE[] = __FILE__;
  91. #endif
  92. fcGsPreviewCtrl::fcGsPreviewCtrl()
  93. {
  94. m_hPanCursor = NULL; // 移动时的图标
  95. m_hCrossCursor = NULL; // 十字图标
  96. m_hOrbitCursor = NULL; // 旋转图标
  97. m_pView = NULL; // 图形系统中的视图,用来绘制图形的区域
  98. m_pDevice = NULL; // 图形系统中的设备,
  99. m_pModel = NULL;
  100. m_bPanning = false; // 是否处于移动图形状态
  101. m_bOrbiting = false; // 是否处于旋转图形状态
  102. m_pDb = NULL; // 该预览空间绑定的数据库
  103. }
  104. fcGsPreviewCtrl::~fcGsPreviewCtrl()
  105. {
  106. Clear();
  107. }
  108. BEGIN_MESSAGE_MAP(fcGsPreviewCtrl, CStatic)
  109. //{{AFX_MSG_MAP(fcGsPreviewCtrl)
  110. ON_WM_PAINT()
  111. ON_WM_SIZE()
  112. ON_WM_MOUSEWHEEL()
  113. ON_WM_LBUTTONDOWN()
  114. ON_WM_MBUTTONDOWN()
  115. ON_WM_MBUTTONUP()
  116. ON_WM_MOUSEMOVE()
  117. ON_WM_NCHITTEST()
  118. ON_WM_SETFOCUS()
  119. ON_WM_LBUTTONUP()
  120. //}}AFX_MSG_MAP
  121. END_MESSAGE_MAP()
  122. /////////////////////////////////////////////////////////////////////////////
  123. // fcGsPreviewCtrl message handlers
  124. void fcGsPreviewCtrl::OnPaint()
  125. {
  126. CPaintDC dc(this);
  127. //刷新图形系统视图
  128. if (m_pView)
  129. {
  130. m_pView->invalidate();
  131. m_pView->update();
  132. }
  133. }
  134. void fcGsPreviewCtrl::OnSize(UINT nType, int cx, int cy)
  135. {
  136. CRect rect;
  137. if (m_pDevice)
  138. {
  139. GetClientRect(&rect);
  140. m_pDevice->onSize(rect.Width(), rect.Height());
  141. }
  142. }
  143. BOOL fcGsPreviewCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
  144. {
  145. if (m_pView)
  146. {
  147. if (zDelta < 0)
  148. m_pView->zoom(0.5);
  149. else
  150. m_pView->zoom(1.5);
  151. Invalidate();
  152. }
  153. return TRUE;
  154. }
  155. void fcGsPreviewCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  156. {
  157. SetFocus();
  158. //设置光标样式
  159. m_bOrbiting = true;
  160. SetCapture();
  161. ::SetClassLong(m_hWnd, GCL_HCURSOR, NULL);
  162. ::SetCursor(m_hOrbitCursor);
  163. m_StartPt = point;
  164. }
  165. void fcGsPreviewCtrl::OnMButtonDown(UINT nFlags, CPoint point)
  166. {
  167. //开始移动
  168. m_bPanning = true;
  169. SetCapture();
  170. ::SetClassLong(m_hWnd,GCL_HCURSOR,NULL);
  171. ::SetCursor(m_hPanCursor);
  172. m_StartPt = point;
  173. }
  174. void fcGsPreviewCtrl::OnMButtonUp(UINT nFlags, CPoint point)
  175. {
  176. ReleaseCapture();
  177. m_bPanning = false;
  178. ::SetClassLong(m_hWnd,GCL_HCURSOR,(long)m_hCrossCursor);
  179. }
  180. //函数功能:鼠标滚轮放大缩小视图
  181. void fcGsPreviewCtrl::OnMouseMove(UINT nFlags, CPoint point)
  182. {
  183. if (m_pView)
  184. {
  185. if (m_bPanning)
  186. {
  187. //完成从设备坐标系统到世界坐标系统的转换
  188. AcGeVector3d pan_vec(-(point.x-m_StartPt.x),point.y-m_StartPt.y,0);
  189. pan_vec.transformBy(m_pView->viewingMatrix() * m_pView->worldToDeviceMatrix().inverse());
  190. m_pView->dolly(pan_vec);
  191. Invalidate();
  192. m_StartPt = point;
  193. }
  194. else if (m_bOrbiting)
  195. {
  196. const double Half_Pi = 1.570796326795;
  197. AcGsDCRect view_rect;
  198. m_pView->getViewport (view_rect);
  199. int nViewportX = (view_rect.m_max.x - view_rect.m_min.x) + 1;
  200. int nViewportY = (view_rect.m_max.y - view_rect.m_min.y) + 1;
  201. int centerX = int(nViewportX / 2.0f) + view_rect.m_min.x;
  202. int centerY = int(nViewportY / 2.0f) + view_rect.m_min.y;
  203. const double radius = min (nViewportX, nViewportY) * 0.4f;
  204. // 从最后和新的鼠标位置计算出两个矢量
  205. AcGeVector3d last_vector ((m_StartPt.x - centerX) / radius,
  206. -(m_StartPt.y - centerY) / radius,
  207. 0.0);
  208. if (last_vector.lengthSqrd () > 1.0) // 超出半径范围
  209. last_vector.normalize ();
  210. else
  211. last_vector.z = sqrt (1.0 - last_vector.x * last_vector.x - last_vector.y * last_vector.y);
  212. AcGeVector3d new_vector((point.x - centerX) / radius,
  213. -(point.y - centerY) / radius,
  214. 0.0);
  215. if (new_vector.lengthSqrd () > 1.0) // 超出半径范围
  216. new_vector.normalize ();
  217. else
  218. new_vector.z = sqrt (1.0 - new_vector.x * new_vector.x - new_vector.y * new_vector.y);
  219. // 确定相机操作的角度
  220. AcGeVector3d rotation_vector (last_vector);
  221. rotation_vector = rotation_vector.crossProduct (new_vector); // rotation_vector = last_vector x new_vector
  222. AcGeVector3d work_vector (rotation_vector);
  223. work_vector.z = 0.0f; // rotation_vector到xy平面的投影
  224. double roll_angle = atan2 (work_vector.x, work_vector.y); // 假设相机的向上矢量是朝上的
  225. // 计算向上的矢量和工作矢量的夹角
  226. double length = rotation_vector.length ();
  227. double orbit_y_angle = (length != 0.0) ? acos (rotation_vector.z / length) + Half_Pi : Half_Pi; // represents inverse cosine of the dot product of the
  228. if (length > 1.0f)
  229. length = 1.0f;
  230. double rotation_angle = asin (length);
  231. // view操作
  232. m_pView->roll( roll_angle);
  233. m_pView->orbit( 0.0f, orbit_y_angle);
  234. m_pView->orbit( rotation_angle, 0.0f);
  235. m_pView->orbit( 0.0f, -orbit_y_angle);
  236. m_pView->roll(-roll_angle);
  237. Invalidate();
  238. m_StartPt = point;
  239. }
  240. else
  241. {
  242. ::SetClassLong(m_hWnd,GCL_HCURSOR,(long)m_hCrossCursor);
  243. SetFocus();
  244. }
  245. }
  246. }
  247. UINT fcGsPreviewCtrl::OnNcHitTest(CPoint point)
  248. {
  249. return HTCLIENT;
  250. }
  251. void fcGsPreviewCtrl::OnSetFocus(CWnd* pOldWnd)
  252. {
  253. ::SetClassLong(m_hWnd, GCL_HCURSOR, (long)m_hCrossCursor);
  254. }
  255. void fcGsPreviewCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  256. {
  257. m_bOrbiting = false;
  258. ::SetClassLong(m_hWnd,GCL_HCURSOR,(long)m_hCrossCursor);
  259. ReleaseCapture();
  260. }
  261. void fcGsPreviewCtrl::Clear()
  262. {
  263. AcGsManager *pGsManager = acgsGetGsManager();
  264. RXASSERT(pGsManager);
  265. if (m_pView)
  266. {
  267. m_pView->eraseAll();
  268. if (m_pDevice)
  269. {
  270. bool b = m_pDevice->erase(m_pView);
  271. RXASSERT(b);
  272. }
  273. AcGsClassFactory *pFactory = pGsManager->getGSClassFactory();
  274. RXASSERT(pFactory);
  275. pFactory->deleteView(m_pView);
  276. m_pView = NULL;
  277. }
  278. if (m_pModel)
  279. {
  280. pGsManager->destroyAutoCADModel(m_pModel);
  281. m_pModel = NULL;
  282. }
  283. if (m_pDevice)
  284. {
  285. pGsManager->destroyAutoCADDevice(m_pDevice);
  286. m_pDevice = NULL;
  287. }
  288. if (m_pDb)
  289. {
  290. delete m_pDb;
  291. m_pDb = NULL;
  292. }
  293. }
  294. //函数功能:传入dwg文件即可预览
  295. BOOL fcGsPreviewCtrl::Init(LPCTSTR szDwgFile)
  296. {
  297. Clear();
  298. m_pDb = new AcDbDatabase(false,true);
  299. Acad::ErrorStatus es = m_pDb->readDwgFile(szDwgFile);
  300. if (es != Acad::eOk)
  301. {
  302. delete m_pDb;
  303. m_pDb = NULL;
  304. }
  305. return InitInner(m_pDb);
  306. }
  307. //函数功能:传入数据库指针即可预览数据库中的实体
  308. BOOL fcGsPreviewCtrl::Init(AcDbDatabase *pDb)
  309. {
  310. Clear();
  311. return InitInner(pDb);
  312. }
  313. //函数功能:获得当前视口的信息。
  314. //输出参数:height 视口高度,width 视口宽度,target 视口中心点,viewDir 视口的观察向量,twist 扭曲的视口
  315. bool fcGsPreviewCtrl::GetActiveViewPortInfo (ads_real &height, ads_real &width,
  316. AcGePoint3d &target, AcGeVector3d &viewDir,
  317. ads_real &viewTwist, bool getViewCenter)
  318. {
  319. AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
  320. if (pDb == NULL)
  321. return false;
  322. AcDbViewportTable *pVTable = NULL;
  323. Acad::ErrorStatus es = pDb->getViewportTable (pVTable, AcDb::kForRead);
  324. if (es == Acad::eOk)
  325. {
  326. AcDbViewportTableRecord *pViewPortRec = NULL;
  327. es = pVTable->getAt ("*Active", pViewPortRec, AcDb::kForRead);
  328. if (es == Acad::eOk)
  329. {
  330. height = pViewPortRec->height ();
  331. width = pViewPortRec->width ();
  332. if (getViewCenter == true)
  333. {
  334. struct resbuf rb;
  335. memset (&rb, 0, sizeof (struct resbuf));
  336. acedGetVar ("VIEWCTR", &rb);
  337. target = AcGePoint3d (rb.resval.rpoint[X], rb.resval.rpoint[Y], rb.resval.rpoint[Z]);
  338. }
  339. else
  340. {
  341. target = pViewPortRec->target ();
  342. }
  343. viewDir = pViewPortRec->viewDirection ();
  344. viewTwist = pViewPortRec->viewTwist ();
  345. }
  346. pVTable->close ();
  347. pViewPortRec->close();
  348. }
  349. return (true);
  350. }
  351. //函数功能:初始化图形系统
  352. void fcGsPreviewCtrl::InitGS(HINSTANCE hRes)
  353. {
  354. // 加载光标
  355. if (m_hPanCursor == NULL)
  356. m_hPanCursor = LoadCursor(hRes,MAKEINTRESOURCE(IDI_PAN));
  357. if (m_hCrossCursor == NULL)
  358. m_hCrossCursor = LoadCursor(hRes,MAKEINTRESOURCE(IDI_CROSS));
  359. if (m_hOrbitCursor == NULL)
  360. m_hOrbitCursor = LoadCursor(hRes,MAKEINTRESOURCE(IDI_ORBIT));
  361. ::SetClassLong(m_hWnd,GCL_HCURSOR,NULL);
  362. // 初始化视图
  363. // 获得图形系统管理器
  364. AcGsManager *pGsManager = acgsGetGsManager();
  365. RXASSERT(pGsManager);
  366. // 获得图形系统类工厂
  367. AcGsClassFactory *pFactory = pGsManager->getGSClassFactory();
  368. RXASSERT(pFactory);
  369. // 创建图形系统设备
  370. m_pDevice = pGsManager->createAutoCADDevice(m_hWnd);
  371. RXASSERT(m_pDevice);
  372. CRect rect;
  373. GetClientRect(&rect);
  374. m_pDevice->onSize(rect.Width(), rect.Height());
  375. // 创建图形系统视图
  376. m_pView = pFactory->createView();
  377. RXASSERT(m_pView);
  378. m_pModel = pGsManager->createAutoCADModel();
  379. RXASSERT(m_pModel);
  380. m_pDevice->add(m_pView);
  381. double height = 0.0, width = 0.0, viewTwist = 0.0;
  382. AcGePoint3d ptTargetView;
  383. AcGeVector3d vecViewDir;
  384. GetActiveViewPortInfo (height, width, ptTargetView, vecViewDir, viewTwist, true);
  385. m_pView->setView(ptTargetView + vecViewDir, ptTargetView,
  386. AcGeVector3d(0.0, 1.0, 0.0), 1.0, 1.0);
  387. }
  388. BOOL fcGsPreviewCtrl::InitInner(AcDbDatabase *pDb)
  389. {
  390. if (pDb == NULL)
  391. {
  392. m_pDb = new AcDbDatabase(true, true);
  393. }
  394. else
  395. {
  396. m_pDb = pDb;
  397. }
  398. if (m_pDb == NULL)
  399. return FALSE;
  400. Acad::ErrorStatus es = Acad::eOk;
  401. AcDbBlockTableRecord *pRec = NULL;
  402. AcDbBlockTable *pTab = NULL;
  403. if ((es = m_pDb->getBlockTable(pTab, AcDb::kForRead))!=Acad::eOk)
  404. return FALSE;
  405. if ((es = pTab->getAt(ACDB_MODEL_SPACE,pRec,AcDb::kForRead))!=Acad::eOk)
  406. {
  407. pTab->close();
  408. return FALSE;
  409. }
  410. pTab->close();
  411. AcDbObjectId idRec = pRec->id();
  412. AcDbObjectIdArray aridEnt;
  413. GetAllEnt(idRec, aridEnt);
  414. GetEntExtents(aridEnt, m_extents);
  415. InitGS(_hdllInstance);
  416. m_pView->add(pRec, m_pModel);
  417. pRec->close();
  418. ZoomE();
  419. return TRUE;
  420. }
  421. // 缩放到整个图纸可见
  422. void fcGsPreviewCtrl::ZoomE()
  423. {
  424. AcGePoint3d ptTargetView;
  425. Mid(m_extents.maxPoint(), m_extents.minPoint(), ptTargetView);
  426. double dLenght = m_extents.maxPoint().x - m_extents.minPoint().x;
  427. double dWidth = m_extents.maxPoint().y - m_extents.minPoint().y;
  428. m_pView->setView(ptTargetView + AcGeVector3d::kZAxis,ptTargetView,AcGeVector3d::kYAxis,dLenght*1.05,dWidth*1.05);
  429. OnPaint();
  430. }
  431. void fcGsPreviewCtrl::Mid(const AcGePoint3d& pt1, const AcGePoint3d& pt2, AcGePoint3d& ptMid)
  432. {
  433. ptMid.x = 0.5 *(pt1.x + pt2.x);
  434. ptMid.y = 0.5 *(pt1.y + pt2.y);
  435. ptMid.z = 0.5 *(pt1.z + pt2.z);
  436. }
  437. //函数功能:获得块中的所有实体
  438. void fcGsPreviewCtrl::GetAllEnt(const AcDbObjectId& idBlockRec, AcDbObjectIdArray& IDArray)
  439. {
  440. IDArray.setPhysicalLength(0);
  441. Acad::ErrorStatus es;
  442. AcDbBlockTableRecord *pBlkRec = NULL;
  443. if (Acad::eOk != (es = acdbOpenObject(pBlkRec,idBlockRec,AcDb::kForRead)))
  444. {
  445. return;
  446. }
  447. AcDbBlockTableRecordIterator *pIt = NULL;
  448. pBlkRec->newIterator(pIt);
  449. pBlkRec->close();
  450. for (pIt->start(); !pIt->done(); pIt->step())
  451. {
  452. AcDbObjectId idEnt;
  453. if (Acad::eOk == pIt->getEntityId(idEnt))
  454. {
  455. IDArray.append(idEnt);
  456. }
  457. }
  458. delete pIt;
  459. pIt = NULL;
  460. }
  461. //函数功能:获得实体的范围
  462. Acad::ErrorStatus fcGsPreviewCtrl::GetEntExtents(const AcDbObjectId& idEnt, AcDbExtents& extents)
  463. {
  464. Acad::ErrorStatus es;
  465. AcDbEntity *pEnt = NULL;
  466. if (Acad::eOk == acdbOpenObject(pEnt, idEnt, AcDb::kForRead))
  467. {
  468. AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(pEnt);
  469. if (pBlkRef)
  470. {
  471. es = pBlkRef->geomExtentsBestFit(extents);
  472. }
  473. else
  474. {
  475. es = pEnt->getGeomExtents(extents);
  476. }
  477. pEnt->close();
  478. }
  479. return (es);
  480. }
  481. void fcGsPreviewCtrl::GetEntExtents(const AcDbObjectIdArray& aridEnt, AcDbExtents& extents)
  482. {
  483. for (int i = 0; i<aridEnt.length();i++)
  484. {
  485. AcDbExtents tem;
  486. if (GetEntExtents(aridEnt[i], tem) == Acad::eOk)
  487. {
  488. extents.addExt(tem);
  489. }
  490. }
  491. }

发表于 2009-5-16 09:58:00 | 显示全部楼层

本帖子中包含更多资源

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

x
 楼主| 发表于 2009-5-20 16:38:00 | 显示全部楼层
还有个问题想问一下高人啊!在插入一个文件中的块到当前文件中,在插入之前怎么先获得这个块的大小???
发表于 2009-5-20 16:55:00 | 显示全部楼层
本帖最后由 作者 于 2009-5-20 17:24:18 编辑

你可以在将块引用加入数据库前调用GeometricExtents属性获取
或者遍历块定义实体
参考下上面ObjectArx的GetEntExtents方法
或者试下:
  1.         [CommandMethod("t5")]
  2.         public static void Test5()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             using (Transaction tr = db.TransactionManager.StartTransaction())
  7.             {
  8.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false);
  9.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt["myblock"], OpenMode.ForRead, false);
  10.                 Extents3d ext3d = new Extents3d();
  11.                 ext3d.AddBlockExtents(btr);
  12.                 doc.Editor.WriteMessage("\n{0}\n{1}", ext3d.MinPoint, ext3d.MaxPoint);
  13.             }
  14.         }

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 10:54 , Processed in 0.205368 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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