| 
					
				 | 
			
			
				@@ -1,16 +1,5 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "cdrapp.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define GET_BOUNDING_BOX(box)                                                  \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  GetBoundingBox(&(box).x, &(box).y, &(box).w, &(box).h, false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define ZERO_4PC 0, 0, 0, 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-typedef struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  double x; // 左下角 x 坐标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  double y; // 左下角 y 坐标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  double w; // 宽度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  double h; // 高度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} BoundingBox; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 bool isDPCurve(IVGShapePtr s) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto dpc = (s->Type == cdrRectangleShape) || (s->Type == cdrEllipseShape) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              (s->Type == cdrCurveShape) || (s->Type == cdrPolygonShape) || 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -18,6 +7,7 @@ bool isDPCurve(IVGShapePtr s) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return dpc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 IVGShapePtr CreateBoundary(corel *cdr, IVGShapePtr s) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto scp = s->CreateBoundary(0, 0, true, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   //  这个 API X7 以上才支持,所以现在直接画矩形 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -59,9 +49,9 @@ bool isIntWith(corel *cdr, IVGShape *s1, IVGShape *s2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 从矩形边界坐标 获得中心坐标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void calculate_center(const BoundingBox *box, double *cx, double *cy) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  *cx = box->x + (box->w / 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  *cy = box->y + (box->h / 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void calculate_center(const BoundingBox &box, double &cx, double &cy) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cx = box.x + (box.w / 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cy = box.y + (box.h / 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // VGCore::cdrPositionOfPointOverShape VGCore::IVGShape::IsOnShape ( double x, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -73,28 +63,51 @@ bool BoundaryGroup(corel *cdr, IVGShapeRange *sr, IVGShapeRange *srs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (sr->Count < 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  BoundingBox box; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  BoundingBox box, bound_box; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   double x, y; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int OnSh = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 处理文字和影响的物件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  auto txtbox = cdr->CreateShapeRange(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  auto sr_text = sr->Shapes->FindShapes(_bstr_t(), cdrTextShape, VARIANT_TRUE, _bstr_t()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (sr_text->Count > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto al = cdr->ActiveLayer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (auto i = 0; i != sr_text->Count; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      sr_text->Shapes->Item[i + 1]->GET_BOUNDING_BOX(box); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      auto s = al->CreateRectangle2(box.x, box.y, box.w, box.h, ZERO_4PC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      txtbox->Add(s); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sr->AddRange(txtbox); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 建立辅助的异性边界物件,需要填充颜色,搞了半天才搞定 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto bounds = sr->CreateBoundary(0, 0, true, false); // 建立异性边界物件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bounds->Fill->UniformColor->RGBAssign(255, 0, 0);    // 填充红色 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto sbox = bounds->BreakApartEx(); // 把边界 拆分为多个边界 用来分组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 删除文字添加的方框 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (sr_text->Count > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sr->RemoveRange(txtbox); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    txtbox->Delete(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 按照边界框异形范围进行分组群组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto srgp = cdr->CreateShapeRange(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (int k = 0; k < sbox->Count; k++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sbox->Shapes->Item[k + 1]->GET_BOUNDING_BOX(bound_box); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for (int i = 0; i < sr->Count; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       auto sh = sr->Shapes->Item[i + 1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      sh->GET_BOUNDING_BOX(box);      // 获得物件矩形边界坐标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      calculate_center(&box, &x, &y); // 获得物件中心坐标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      sh->GET_BOUNDING_BOX(box);   // 获得物件矩形边界坐标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      calculate_center(box, x, y); // 获得物件中心坐标 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       OnSh = sbox->Shapes->Item[k + 1]->IsOnShape(x, y, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (OnSh) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         srgp->Add(sh); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } else if (isIntWith(cdr, sbox->Shapes->Item[k + 1], sh)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        srgp->Add(sh); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else if (isOverlapped(box, bound_box)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (isIntWith(cdr, sbox->Shapes->Item[k + 1], sh)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          srgp->Add(sh); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 从Range中移除已分组的图形 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -102,8 +115,9 @@ bool BoundaryGroup(corel *cdr, IVGShapeRange *sr, IVGShapeRange *srs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     srs->Add(srgp->Group()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     srgp->RemoveAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 删除辅助的异性边界物件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   sbox->Delete(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |