|
@@ -1,4 +1,6 @@
|
|
#include "cdrapp.h"
|
|
#include "cdrapp.h"
|
|
|
|
+#include <cerrno>
|
|
|
|
+#include <cmath>
|
|
|
|
|
|
bool isDPCurve(IVGShapePtr s) {
|
|
bool isDPCurve(IVGShapePtr s) {
|
|
auto dpc = (s->Type == cdrRectangleShape) || (s->Type == cdrEllipseShape) ||
|
|
auto dpc = (s->Type == cdrRectangleShape) || (s->Type == cdrEllipseShape) ||
|
|
@@ -69,7 +71,8 @@ bool BoundaryGroup(corel *cdr, IVGShapeRange *sr, IVGShapeRange *srs) {
|
|
|
|
|
|
// 处理文字和影响的物件
|
|
// 处理文字和影响的物件
|
|
auto txtbox = cdr->CreateShapeRange();
|
|
auto txtbox = cdr->CreateShapeRange();
|
|
- auto sr_text = sr->Shapes->FindShapes(_bstr_t(), cdrTextShape, VARIANT_TRUE, _bstr_t());
|
|
|
|
|
|
+ auto sr_text =
|
|
|
|
+ sr->Shapes->FindShapes(_bstr_t(), cdrTextShape, VARIANT_TRUE, _bstr_t());
|
|
if (sr_text->Count > 0) {
|
|
if (sr_text->Count > 0) {
|
|
auto al = cdr->ActiveLayer;
|
|
auto al = cdr->ActiveLayer;
|
|
for (auto i = 0; i != sr_text->Count; i++) {
|
|
for (auto i = 0; i != sr_text->Count; i++) {
|
|
@@ -85,6 +88,7 @@ bool BoundaryGroup(corel *cdr, IVGShapeRange *sr, IVGShapeRange *srs) {
|
|
bounds->Fill->UniformColor->RGBAssign(255, 0, 0); // 填充红色
|
|
bounds->Fill->UniformColor->RGBAssign(255, 0, 0); // 填充红色
|
|
auto sbox = bounds->BreakApartEx(); // 把边界 拆分为多个边界 用来分组
|
|
auto sbox = bounds->BreakApartEx(); // 把边界 拆分为多个边界 用来分组
|
|
|
|
|
|
|
|
+
|
|
// 删除文字添加的方框
|
|
// 删除文字添加的方框
|
|
if (sr_text->Count > 0) {
|
|
if (sr_text->Count > 0) {
|
|
sr->RemoveRange(txtbox);
|
|
sr->RemoveRange(txtbox);
|
|
@@ -124,14 +128,37 @@ bool BoundaryGroup(corel *cdr, IVGShapeRange *sr, IVGShapeRange *srs) {
|
|
// 测试运行 异形群组
|
|
// 测试运行 异形群组
|
|
void run_BoundaryGroup(corel *cdr) {
|
|
void run_BoundaryGroup(corel *cdr) {
|
|
auto start = std::chrono::high_resolution_clock::now(); // 开始时间
|
|
auto start = std::chrono::high_resolution_clock::now(); // 开始时间
|
|
|
|
+ if (cdr->VersionMajor < 17) {
|
|
|
|
+ sprintf(infobuf, "异形群组目前只支持X7以上版本!");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
BeginOpt(cdr);
|
|
BeginOpt(cdr);
|
|
|
|
|
|
auto sr = cdr->ActiveSelectionRange;
|
|
auto sr = cdr->ActiveSelectionRange;
|
|
auto srs = cdr->CreateShapeRange();
|
|
auto srs = cdr->CreateShapeRange();
|
|
|
|
+ auto sr_box = cdr->CreateShapeRange();
|
|
|
|
+
|
|
int cnt = sr->Count;
|
|
int cnt = sr->Count;
|
|
|
|
|
|
|
|
+ // 取消选择,速度优化
|
|
cdr->ActiveDocument->ClearSelection();
|
|
cdr->ActiveDocument->ClearSelection();
|
|
- BoundaryGroup(cdr, sr, srs);
|
|
|
|
|
|
+
|
|
|
|
+ if (cnt > 300) {
|
|
|
|
+ // 调用矩形分组,分布执行异形群组
|
|
|
|
+ if (BoxGrouping(cdr, sr, sr_box, 1.0)) {
|
|
|
|
+ for (int i = 0; i < sr_box->Count; i++) {
|
|
|
|
+ auto s = sr_box->Shapes->Item[i + 1];
|
|
|
|
+ if (!s->IsSimpleShape) {
|
|
|
|
+ auto sr2 = s->UngroupEx();
|
|
|
|
+ BoundaryGroup(cdr, sr2, srs);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ BoundaryGroup(cdr, sr, srs);
|
|
|
|
+ }
|
|
|
|
+
|
|
srs->CreateSelection();
|
|
srs->CreateSelection();
|
|
|
|
|
|
// 计算持续时间
|
|
// 计算持续时间
|