|
@@ -2,135 +2,199 @@
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#define _USE_MATH_DEFINES
|
|
|
-#include <math.h> // C++ 在 math.h 中定义 M_PI 需要 _USE_MATH_DEFINES 宏
|
|
|
-
|
|
|
-bool Test_Intersect(corel* cdr){
|
|
|
- cdr->ActiveDocument->Unit = cdrInch;
|
|
|
- IVGShapePtr s[3];
|
|
|
- IVGShapePtr si[3];
|
|
|
- IVGShapePtr sm;
|
|
|
- double x, y, radius = 1.5 ;
|
|
|
- int r, g, b;
|
|
|
-
|
|
|
- // 通过将 i 乘以 2.09439507 (120度的弧度),可以将三个椭圆均匀地分布在一个圆上。
|
|
|
- // radius = 1.5 则是决定椭圆的大小。 这个数字控制椭圆的半径,也就是椭圆的大小。 // 创建3个椭圆, 填色 RGB:
|
|
|
- for (int i = 0; i != 3; i++) {
|
|
|
- x = cdr->ActivePage->SizeWidth / 2 + 1 * cos(i * M_PI * 2.0 / 3.0);
|
|
|
- y = cdr->ActivePage->SizeHeight / 2 + 1 * sin(i * M_PI * 2.0 / 3.0);
|
|
|
- s[i] = MakeEllipse(cdr, x, y, radius);
|
|
|
- r = 255 * (i == 0);
|
|
|
- g = 255 * (i == 1);
|
|
|
- b = 255 * (i == 2);
|
|
|
- s[i]->Fill->UniformColor->RGBAssign(r, g, b);
|
|
|
- }
|
|
|
+#include <math.h> // C++ 在 math.h 中定义 M_PI 需要 _USE_MATH_DEFINES 宏
|
|
|
|
|
|
-// 创建3个相交物件, IVGShape::Intersect 函数原型
|
|
|
-// IVGShapePtr IVGShape::Intersect ( struct IVGShape * TargetShape, VARIANT_BOOL LeaveSource, VARIANT_BOOL LeaveTarget );
|
|
|
- for (int i = 0; i != 3; i++) {
|
|
|
- int n = (i + 1) % 3;
|
|
|
- si[i] = s[i]->Intersect(s[n], true, true);
|
|
|
- auto c1 = s[i]->Fill->UniformColor;
|
|
|
- auto c2 = s[n]->Fill->UniformColor;
|
|
|
- r = c1->RGBRed + c2->RGBRed;
|
|
|
- g = c1->RGBGreen + c2->RGBGreen;
|
|
|
- b = c1->RGBBlue + c2->RGBBlue;
|
|
|
- si[i]->Fill->UniformColor->RGBAssign(r, g, b);
|
|
|
+bool isDPCurve(IVGShapePtr s) {
|
|
|
+ auto dpc = (s->Type == cdrRectangleShape) || (s->Type == cdrEllipseShape) ||
|
|
|
+ (s->Type == cdrCurveShape) || (s->Type == cdrPolygonShape) ||
|
|
|
+ (s->Type == cdrBitmapShape);
|
|
|
+ return dpc;
|
|
|
+}
|
|
|
+IVGShapePtr CreateBoundary(corel *cdr, IVGShapePtr s) {
|
|
|
+ // auto scp = s2->CreateBoundary(0, 0 , true, true);
|
|
|
+ // 这个 API X7 以上才支持,所以现在直接画矩形
|
|
|
+ BoundingBox box;
|
|
|
+ s->GET_BOUNDING_BOX(box);
|
|
|
+ auto scp =
|
|
|
+ cdr->ActiveLayer->CreateRectangle2(box.x, box.y, box.w, box.h, ZERO_4PC);
|
|
|
+ return scp;
|
|
|
+}
|
|
|
+// VGCore::IVGShapePtr VGCore::IVGShape::CreateBoundary ( double x, double y,
|
|
|
+// VARIANT_BOOL PlaceOnTop, VARIANT_BOOL DeleteSource ); VGCore::IVGShapePtr
|
|
|
+// VGCore::IVGShapeRange::CreateBoundary ( double x, double y, VARIANT_BOOL
|
|
|
+// PlaceOnTop, VARIANT_BOOL DeleteSource ); VARIANT_BOOL
|
|
|
+// VGCore::IVGCurve::IntersectsWith ( struct IVGCurve * Curve )
|
|
|
+void test_IntersectsWith(corel *cdr) {
|
|
|
+
|
|
|
+ auto sr = cdr->ActiveSelectionRange;
|
|
|
+ if (1 < sr->Count) {
|
|
|
+ bool isIn = false;
|
|
|
+
|
|
|
+ auto s1 = sr->Shapes->Item[1];
|
|
|
+ auto s2 = sr->Shapes->Item[2];
|
|
|
+
|
|
|
+ if (isDPCurve(s1) && isDPCurve(s2)) {
|
|
|
+ isIn = s1->GetDisplayCurve()->IntersectsWith(s2->GetDisplayCurve());
|
|
|
+ } else if (isDPCurve(s1)) {
|
|
|
+ // 群组文字和OLE等其他类型,创建一个临时边界范围
|
|
|
+ auto scp = CreateBoundary(cdr, s2);
|
|
|
+ isIn = s1->GetDisplayCurve()->IntersectsWith(scp->GetDisplayCurve());
|
|
|
+ scp->Delete();
|
|
|
+
|
|
|
+ } else if (isDPCurve(s2)) {
|
|
|
+ auto scp = CreateBoundary(cdr, s1);
|
|
|
+ isIn = scp->GetDisplayCurve()->IntersectsWith(s2->GetDisplayCurve());
|
|
|
+ scp->Delete();
|
|
|
+ } else {
|
|
|
+ auto scp = CreateBoundary(cdr, s1);
|
|
|
+ auto scp2 = CreateBoundary(cdr, s2);
|
|
|
+ isIn = scp->GetDisplayCurve()->IntersectsWith(scp2->GetDisplayCurve());
|
|
|
+ scp->Delete();
|
|
|
+ scp2->Delete();
|
|
|
}
|
|
|
|
|
|
- // 建立相交物件,填充白色
|
|
|
- sm = si[1]->Intersect(si[2], true, true);
|
|
|
- auto c3 = cdr->CreateRGBColor(255, 255, 255);
|
|
|
- sm->Fill->UniformColor = c3;
|
|
|
-
|
|
|
- return true;
|
|
|
+ if (isIn)
|
|
|
+ Test_Intersect(cdr);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+bool Test_Intersect(corel *cdr) {
|
|
|
+ cdr->ActiveDocument->Unit = cdrInch;
|
|
|
+ IVGShapePtr s[3];
|
|
|
+ IVGShapePtr si[3];
|
|
|
+ IVGShapePtr sm;
|
|
|
+ double x, y, radius = 1.5;
|
|
|
+ int r, g, b;
|
|
|
+
|
|
|
+ // 通过将 i 乘以 2.09439507 (120度的弧度),可以将三个椭圆均匀地分布在一个圆上。
|
|
|
+ // radius = 1.5 则是决定椭圆的大小。 这个数字控制椭圆的半径,也就是椭圆的大小。
|
|
|
+ // // 创建3个椭圆, 填色 RGB:
|
|
|
+ for (int i = 0; i != 3; i++) {
|
|
|
+ x = cdr->ActivePage->SizeWidth / 2 + 1 * cos(i * M_PI * 2.0 / 3.0);
|
|
|
+ y = cdr->ActivePage->SizeHeight / 2 + 1 * sin(i * M_PI * 2.0 / 3.0);
|
|
|
+ s[i] = MakeEllipse(cdr, x, y, radius);
|
|
|
+ r = 255 * (i == 0);
|
|
|
+ g = 255 * (i == 1);
|
|
|
+ b = 255 * (i == 2);
|
|
|
+ s[i]->Fill->UniformColor->RGBAssign(r, g, b);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建3个相交物件, IVGShape::Intersect 函数原型
|
|
|
+ // IVGShapePtr IVGShape::Intersect ( struct IVGShape * TargetShape,
|
|
|
+ // VARIANT_BOOL LeaveSource, VARIANT_BOOL LeaveTarget );
|
|
|
+ for (int i = 0; i != 3; i++) {
|
|
|
+ int n = (i + 1) % 3;
|
|
|
+ si[i] = s[i]->Intersect(s[n], true, true);
|
|
|
+ auto c1 = s[i]->Fill->UniformColor;
|
|
|
+ auto c2 = s[n]->Fill->UniformColor;
|
|
|
+ r = c1->RGBRed + c2->RGBRed;
|
|
|
+ g = c1->RGBGreen + c2->RGBGreen;
|
|
|
+ b = c1->RGBBlue + c2->RGBBlue;
|
|
|
+ si[i]->Fill->UniformColor->RGBAssign(r, g, b);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 建立相交物件,填充白色
|
|
|
+ sm = si[1]->Intersect(si[2], true, true);
|
|
|
+ auto c3 = cdr->CreateRGBColor(255, 255, 255);
|
|
|
+ sm->Fill->UniformColor = c3;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
|
|
|
+bool polygon_gravity_dot(corel *cdr) {
|
|
|
+ cdr->ActiveDocument->Unit = cdrMillimeter;
|
|
|
+ double x, y;
|
|
|
|
|
|
-bool polygon_gravity_dot(corel* cdr){
|
|
|
- cdr->ActiveDocument->Unit = cdrMillimeter;
|
|
|
- double x, y;
|
|
|
-
|
|
|
-// IVGShapePtr ActiveShape; // 获取当前选中的图形 函数原型
|
|
|
- auto s = cdr->ActiveShape;
|
|
|
+ // IVGShapePtr ActiveShape; // 获取当前选中的图形 函数原型
|
|
|
+ auto s = cdr->ActiveShape;
|
|
|
|
|
|
-// IVGShapeRangePtr IVGApplication::CreateShapeRange ( );
|
|
|
- auto srs = cdr->CreateShapeRange();
|
|
|
+ // IVGShapeRangePtr IVGApplication::CreateShapeRange ( );
|
|
|
+ auto srs = cdr->CreateShapeRange();
|
|
|
|
|
|
-// 获取节点函数原型
|
|
|
-// IVGNodePtr IVGNodes::GetItem ( long Index );
|
|
|
-// IVGNodePtr IVGNodeRange::GetItem ( long Index );
|
|
|
+ // 获取节点函数原型
|
|
|
+ // IVGNodePtr IVGNodes::GetItem ( long Index );
|
|
|
+ // IVGNodePtr IVGNodeRange::GetItem ( long Index );
|
|
|
|
|
|
- for(auto i = 0; i < s->DisplayCurve->Nodes->Count; i++){
|
|
|
- auto n = s->DisplayCurve->Nodes->Item[i+1];
|
|
|
+ for (auto i = 0; i < s->DisplayCurve->Nodes->Count; i++) {
|
|
|
+ auto n = s->DisplayCurve->Nodes->Item[i + 1];
|
|
|
|
|
|
- x = n->PositionX;
|
|
|
- y = n->PositionY;
|
|
|
- printf("%f, %f\n", x, y);
|
|
|
+ x = n->PositionX;
|
|
|
+ y = n->PositionY;
|
|
|
+ printf("%f, %f\n", x, y);
|
|
|
|
|
|
- // auto sy = MakeEllipse(cdr, x, y, 5);
|
|
|
- // sy->Outline->Color->RGBAssign(255, 0, 0);
|
|
|
+ // auto sy = MakeEllipse(cdr, x, y, 5);
|
|
|
+ // sy->Outline->Color->RGBAssign(255, 0, 0);
|
|
|
|
|
|
- // auto sj = MakeRectangle(cdr, x, y, 10, 10);
|
|
|
- // sj->Outline->Color->RGBAssign(0, 255, 0);
|
|
|
+ // auto sj = MakeRectangle(cdr, x, y, 10, 10);
|
|
|
+ // sj->Outline->Color->RGBAssign(0, 255, 0);
|
|
|
|
|
|
- auto l = DrawLine(cdr, x, y, s->CenterX, s->CenterY);
|
|
|
- srs->Add(l);
|
|
|
- }
|
|
|
+ auto l = DrawLine(cdr, x, y, s->CenterX, s->CenterY);
|
|
|
+ srs->Add(l);
|
|
|
+ }
|
|
|
|
|
|
-// HRESULT IVGShapeRange::CreateSelection ( );
|
|
|
- srs->CreateSelection();
|
|
|
+ // HRESULT IVGShapeRange::CreateSelection ( );
|
|
|
+ srs->CreateSelection();
|
|
|
|
|
|
- return true;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
// 建立矩形和圆形函数原型
|
|
|
-// IVGShapePtr IVGLayer::CreateRectangle2 ( double x, double y, double Width, double Height,
|
|
|
-// double RadiusUL, double RadiusUR, double RadiusLR, double RadiusLL );
|
|
|
-
|
|
|
-// IVGShapePtr IVGLayer::CreateEllipse2 ( double CenterX, double CenterY, double Radius1,
|
|
|
-// double Radius2, double StartAngle, double EndAngle, VARIANT_BOOL Pie );
|
|
|
-IVGShapePtr MakeEllipse(corel* cdr, double x, double y, double r){
|
|
|
- return cdr->ActiveLayer->CreateEllipse2(x, y, r, ZERO_4PC);
|
|
|
+// IVGShapePtr IVGLayer::CreateRectangle2 ( double x, double y, double Width,
|
|
|
+// double Height,
|
|
|
+// double RadiusUL, double RadiusUR, double RadiusLR,
|
|
|
+// double RadiusLL );
|
|
|
+
|
|
|
+// IVGShapePtr IVGLayer::CreateEllipse2 ( double CenterX, double CenterY,
|
|
|
+// double Radius1,
|
|
|
+// double Radius2, double StartAngle, double EndAngle,
|
|
|
+// VARIANT_BOOL Pie );
|
|
|
+IVGShapePtr MakeEllipse(corel *cdr, double x, double y, double r) {
|
|
|
+ return cdr->ActiveLayer->CreateEllipse2(x, y, r, ZERO_4PC);
|
|
|
}
|
|
|
|
|
|
-IVGShapePtr MakeEllipse(corel* cdr, IVGShapePtr s, double r){
|
|
|
- double x, y;
|
|
|
- x = s->CenterX;
|
|
|
- y = s->CenterY;
|
|
|
- return cdr->ActiveLayer->CreateEllipse2(x, y, r, ZERO_4PC);
|
|
|
+IVGShapePtr MakeEllipse(corel *cdr, IVGShapePtr s, double r) {
|
|
|
+ double x, y;
|
|
|
+ x = s->CenterX;
|
|
|
+ y = s->CenterY;
|
|
|
+ return cdr->ActiveLayer->CreateEllipse2(x, y, r, ZERO_4PC);
|
|
|
}
|
|
|
|
|
|
-IVGShapePtr MakeRectangle(corel* cdr, double x, double y, double w, double h){
|
|
|
- auto sj = cdr->ActiveLayer->CreateRectangle2(x, y, w, h, ZERO_4PC);
|
|
|
- sj->PutCenterX(x);
|
|
|
- sj->PutCenterY(y);
|
|
|
- return sj;
|
|
|
+IVGShapePtr MakeRectangle(corel *cdr, double x, double y, double w, double h) {
|
|
|
+ auto sj = cdr->ActiveLayer->CreateRectangle2(x, y, w, h, ZERO_4PC);
|
|
|
+ sj->PutCenterX(x);
|
|
|
+ sj->PutCenterY(y);
|
|
|
+ return sj;
|
|
|
}
|
|
|
|
|
|
-IVGShapePtr MakeRectangle(corel* cdr, IVGShapePtr s, double w, double h){
|
|
|
- double x, y;
|
|
|
- x = s->CenterX;
|
|
|
- y = s->CenterY;
|
|
|
- auto sj = cdr->ActiveLayer->CreateRectangle2(x, y, w, h, ZERO_4PC);
|
|
|
- sj->PutCenterX(x);
|
|
|
- sj->PutCenterY(y);
|
|
|
- return sj;
|
|
|
+IVGShapePtr MakeRectangle(corel *cdr, IVGShapePtr s, double w, double h) {
|
|
|
+ double x, y;
|
|
|
+ x = s->CenterX;
|
|
|
+ y = s->CenterY;
|
|
|
+ auto sj = cdr->ActiveLayer->CreateRectangle2(x, y, w, h, ZERO_4PC);
|
|
|
+ sj->PutCenterX(x);
|
|
|
+ sj->PutCenterY(y);
|
|
|
+ return sj;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-// IVGShapePtr IVGLayer::CreateLineSegment ( double StartX, double StartY, double EndX, double EndY );
|
|
|
-// 画一条线,设置轮廓色 M100
|
|
|
-IVGShapePtr DrawLine(corel* cdr, double x1, double y1, double x2, double y2){
|
|
|
- auto line = cdr->ActiveLayer->CreateLineSegment(x1, y1, x2, y2);
|
|
|
- line->Outline->Color->CMYKAssign(0, 100, 0, 0);
|
|
|
- return line;
|
|
|
+// IVGShapePtr IVGLayer::CreateLineSegment ( double StartX, double StartY,
|
|
|
+// double EndX, double EndY ); 画一条线,设置轮廓色 M100
|
|
|
+IVGShapePtr DrawLine(corel *cdr, double x1, double y1, double x2, double y2) {
|
|
|
+ auto line = cdr->ActiveLayer->CreateLineSegment(x1, y1, x2, y2);
|
|
|
+ line->Outline->Color->CMYKAssign(0, 100, 0, 0);
|
|
|
+ return line;
|
|
|
}
|
|
|
|
|
|
-// IVGShapePtr IVGLayer::FindShape ( _bstr_t Name, enum cdrShapeType Type, long StaticID, VARIANT_BOOL Recursive );
|
|
|
+// IVGShapePtr IVGLayer::FindShape ( _bstr_t Name, enum cdrShapeType Type, long
|
|
|
+// StaticID, VARIANT_BOOL Recursive );
|
|
|
|
|
|
-// IVGShapePtr IVGLayer::CreateCurveSegment ( double StartX, double StartY, double EndX, double EndY, double StartingControlPointLength,
|
|
|
-// double StartingControlPointAngle, double EndingControlPointLength, double EndingControlPointAngle );
|
|
|
+// IVGShapePtr IVGLayer::CreateCurveSegment ( double StartX, double StartY,
|
|
|
+// double EndX, double EndY, double StartingControlPointLength,
|
|
|
+// double StartingControlPointAngle, double
|
|
|
+// EndingControlPointLength, double
|
|
|
+// EndingControlPointAngle );
|
|
|
|
|
|
-// IVGShapePtr IVGLayer::CreateCurveSegment2 ( double x1, double y1, double StartingControlPointX, double StartingControlPointY,
|
|
|
-// double EndingControlPointX, double EndingControlPointY, double x2, double y2 );
|
|
|
+// IVGShapePtr IVGLayer::CreateCurveSegment2 ( double x1, double y1, double
|
|
|
+// StartingControlPointX, double StartingControlPointY,
|
|
|
+// double EndingControlPointX, double
|
|
|
+// EndingControlPointY, double x2,
|
|
|
+// double y2 );
|