개정판 5adeae43
converter spec break arrange
Change-Id: Iaaa0ad4f7413d49dac267dcd86e363828fd878f7
DTI_PID/SPPIDConverter/AutoModeling.cs | ||
---|---|---|
47 | 47 |
DataTable nominalDiameterTable = null; |
48 | 48 |
public string DocumentLabelText { get; set; } |
49 | 49 |
|
50 |
List<double[]> itemRange = new List<double[]>(); |
|
51 |
|
|
50 | 52 |
List<Line> BranchLines = new List<Line>(); |
51 | 53 |
List<string> ZeroLengthSymbolToSymbolModelItemID = new List<string>(); |
52 | 54 |
List<string> ZeroLengthModelItemID = new List<string>(); |
... | ... | |
137 | 139 |
// 같은 Type의 Line일 경우 Join함 |
138 | 140 |
RunJoinRun(); |
139 | 141 |
|
142 |
// avoid interference |
|
143 |
SetConnectorAndSymbolRange(); |
|
140 | 144 |
// EndBreak Modeling |
141 | 145 |
RunEndBreakModeling(); |
146 |
// avoid interference |
|
147 |
SetConnectorAndSymbolRange(); |
|
142 | 148 |
// SpecBreak Modeling |
143 | 149 |
RunSpecBreakModeling(); |
144 | 150 |
//Line Number Modeling |
... | ... | |
3122 | 3128 |
|
3123 | 3129 |
MoveDependencyObject(endBreak.SPPID.GraphicOID, location); |
3124 | 3130 |
|
3131 |
// end break arrange |
|
3132 |
MoveSegmentBreak(_LmLabelPersist.RepresentationObject.Id, _LmLabelPersist); |
|
3133 |
|
|
3125 | 3134 |
ReleaseCOMObjects(_LmLabelPersist); |
3126 | 3135 |
} |
3127 | 3136 |
ReleaseCOMObjects(targetLMConnector); |
... | ... | |
3272 | 3281 |
array = new double[] { 0, point[0], point[1] }; |
3273 | 3282 |
else |
3274 | 3283 |
array = new double[] { 0, specBreak.SPPID.ORIGINAL_X, specBreak.SPPID.ORIGINAL_Y }; |
3275 |
LMLabelPersist _LmLabelPersist = _placement.PIDPlaceLabel(MappingPath, ref array, LabeledItem: targetLMConnector.AsLMRepresentation(), IsLeaderVisible: mapping.LeaderLine); |
|
3284 |
LMLabelPersist _LmLabelPersist = _placement.PIDPlaceLabel(MappingPath, ref array, null, null, LabeledItem: targetLMConnector.AsLMRepresentation(), IsLeaderVisible: mapping.LeaderLine);
|
|
3276 | 3285 |
|
3277 | 3286 |
if (_LmLabelPersist != null) |
3278 | 3287 |
{ |
... | ... | |
3284 | 3293 |
|
3285 | 3294 |
MoveDependencyObject(specBreak.SPPID.GraphicOID, location); |
3286 | 3295 |
|
3296 |
// spec break arrange |
|
3297 |
MoveSegmentBreak(_LmLabelPersist.RepresentationObject.Id, _LmLabelPersist); |
|
3298 |
|
|
3287 | 3299 |
ReleaseCOMObjects(_LmLabelPersist); |
3288 | 3300 |
} |
3289 | 3301 |
} |
... | ... | |
3305 | 3317 |
} |
3306 | 3318 |
} |
3307 | 3319 |
|
3320 |
private bool IsRhombus(LMLabelPersist labelPersist, out double x, out double y, out double radius) |
|
3321 |
{ |
|
3322 |
bool result = false; |
|
3323 |
x = 0; y = 0; radius = 0; |
|
3324 |
|
|
3325 |
string oid = labelPersist.get_GraphicOID().ToString(); |
|
3326 |
DependencyObject dependency = radApp.ActiveDocument.ActiveSheet.DrawingObjects[oid] as DependencyObject; |
|
3327 |
|
|
3328 |
if (dependency != null) |
|
3329 |
{ |
|
3330 |
bool isLabel = false; |
|
3331 |
foreach (var attributes in dependency.AttributeSets) |
|
3332 |
{ |
|
3333 |
foreach (var attribute in attributes) |
|
3334 |
{ |
|
3335 |
string name = attribute.Name; |
|
3336 |
string value = attribute.GetValue().ToString(); |
|
3337 |
if (name == "DrawingItemType" && value == "LabelPersist") |
|
3338 |
{ |
|
3339 |
isLabel = true; |
|
3340 |
break; |
|
3341 |
} |
|
3342 |
} |
|
3343 |
} |
|
3344 |
if (isLabel) |
|
3345 |
{ |
|
3346 |
double minX = double.MaxValue, minY = double.MaxValue, maxX = double.MinValue, maxY = double.MinValue; |
|
3347 |
foreach (DrawingObjectBase drawingObject in dependency.DrawingObjects) |
|
3348 |
{ |
|
3349 |
if (drawingObject.Type == Ingr.RAD2D.ObjectType.igLine2d) |
|
3350 |
{ |
|
3351 |
Ingr.RAD2D.Line2d line2D = drawingObject as Ingr.RAD2D.Line2d; |
|
3352 |
|
|
3353 |
double x1, y1, x2, y2; |
|
3354 |
line2D.GetStartPoint(out x1, out y1); |
|
3355 |
line2D.GetEndPoint(out x2, out y2); |
|
3356 |
double tX1 = Math.Min(x1, x2), tY1 = Math.Min(y1, y2), tX2 = Math.Max(x1, x2), tY2 = Math.Max(y1, y2); |
|
3357 |
if (minX > tX1) |
|
3358 |
minX = tX1; |
|
3359 |
if (minY > tY1) |
|
3360 |
minY = tY1; |
|
3361 |
if (maxX < tX2) |
|
3362 |
maxX = tX2; |
|
3363 |
if (maxY < tY2) |
|
3364 |
maxY = tY2; |
|
3365 |
} |
|
3366 |
} |
|
3367 |
|
|
3368 |
double width = Math.Abs(maxX - minX); |
|
3369 |
double height = Math.Abs(maxY - minY); |
|
3370 |
double ratio = width / height * 100; |
|
3371 |
if (ratio > 99d && ratio < 101d) |
|
3372 |
{ |
|
3373 |
result = true; |
|
3374 |
} |
|
3375 |
x = (maxX + minX) / 2d; |
|
3376 |
y = (maxY + minY) / 2d; |
|
3377 |
radius = width / 2d; |
|
3378 |
} |
|
3379 |
} |
|
3380 |
|
|
3381 |
return result; |
|
3382 |
} |
|
3383 |
|
|
3384 |
private void MoveSegmentBreak(string connectorID, LMLabelPersist labelPersist) |
|
3385 |
{ |
|
3386 |
bool bFind = false; |
|
3387 |
double x, y, radius; |
|
3388 |
if (IsRhombus(labelPersist, out x, out y, out radius)) |
|
3389 |
{ |
|
3390 |
List<double[]> itemPoints = new List<double[]>(); |
|
3391 |
LMConnector connector = dataSource.GetConnector(connectorID); |
|
3392 |
foreach (LMLabelPersist label in connector.LabelPersists) |
|
3393 |
{ |
|
3394 |
if (!"Active".Equals(label.get_ItemStatus())) |
|
3395 |
continue; |
|
3396 |
|
|
3397 |
if (!label.Id.Equals(labelPersist.Id)) |
|
3398 |
{ |
|
3399 |
double centerX, centerY, temp; |
|
3400 |
if (IsRhombus(label, out centerX, out centerY, out temp)) |
|
3401 |
{ |
|
3402 |
bFind = true; |
|
3403 |
itemPoints.Add(new double[] { centerX, centerY }); |
|
3404 |
} |
|
3405 |
} |
|
3406 |
} |
|
3407 |
ReleaseCOMObjects(connector); |
|
3408 |
|
|
3409 |
|
|
3410 |
if (bFind) |
|
3411 |
{ |
|
3412 |
double[] startPoint = itemPoints.First(); |
|
3413 |
itemPoints.RemoveAt(0); |
|
3414 |
|
|
3415 |
for (int i = 0; i < 8; i++) |
|
3416 |
{ |
|
3417 |
double pointX = 0, pointY = 0; |
|
3418 |
switch (i) |
|
3419 |
{ |
|
3420 |
case 0: |
|
3421 |
pointX = startPoint[0] + radius; |
|
3422 |
pointY = startPoint[1] + radius; |
|
3423 |
break; |
|
3424 |
case 1: |
|
3425 |
pointX = startPoint[0] + radius + radius; |
|
3426 |
pointY = startPoint[1]; |
|
3427 |
break; |
|
3428 |
case 2: |
|
3429 |
pointX = startPoint[0] + radius; |
|
3430 |
pointY = startPoint[1] - radius; |
|
3431 |
break; |
|
3432 |
case 3: |
|
3433 |
pointX = startPoint[0]; |
|
3434 |
pointY = startPoint[1] - radius - radius; |
|
3435 |
break; |
|
3436 |
case 4: |
|
3437 |
pointX = startPoint[0] - radius; |
|
3438 |
pointY = startPoint[1] - radius; |
|
3439 |
break; |
|
3440 |
case 5: |
|
3441 |
pointX = startPoint[0] - radius - radius; |
|
3442 |
pointY = startPoint[1]; |
|
3443 |
break; |
|
3444 |
case 6: |
|
3445 |
pointX = startPoint[0] - radius; |
|
3446 |
pointY = startPoint[1] + radius; |
|
3447 |
break; |
|
3448 |
case 7: |
|
3449 |
pointX = startPoint[0]; |
|
3450 |
pointY = startPoint[1] + radius + radius; |
|
3451 |
break; |
|
3452 |
default: |
|
3453 |
break; |
|
3454 |
} |
|
3455 |
|
|
3456 |
if (!ExistSegmentByPoint(pointX, pointY)) |
|
3457 |
{ |
|
3458 |
DependencyObject dependency = radApp.ActiveDocument.ActiveSheet.DrawingObjects[labelPersist.get_GraphicOID().ToString()] as DependencyObject; |
|
3459 |
if (dependency != null) |
|
3460 |
{ |
|
3461 |
radApp.ActiveSelectSet.RemoveAll(); |
|
3462 |
radApp.ActiveSelectSet.Add(dependency); |
|
3463 |
Ingr.RAD2D.Transform transform = dependency.GetTransform(); |
|
3464 |
transform.DefineByMove2d(pointX - x, pointY - y); |
|
3465 |
radApp.ActiveSelectSet.Transform(transform, true); |
|
3466 |
radApp.ActiveSelectSet.RemoveAll(); |
|
3467 |
} |
|
3468 |
break; |
|
3469 |
} |
|
3470 |
} |
|
3471 |
|
|
3472 |
bool ExistSegmentByPoint(double pointX, double pointY) |
|
3473 |
{ |
|
3474 |
bool result = false; |
|
3475 |
foreach (var item in itemPoints) |
|
3476 |
{ |
|
3477 |
double distance = SPPIDUtil.CalcPointToPointdDistance(item[0], item[1], pointX, pointY); |
|
3478 |
if (Math.Truncate(distance * 1000000000d).Equals(0)) |
|
3479 |
result = true; |
|
3480 |
} |
|
3481 |
return result; |
|
3482 |
} |
|
3483 |
} |
|
3484 |
} |
|
3485 |
|
|
3486 |
if (!bFind) |
|
3487 |
MoveSegmentBestLocation(labelPersist.get_GraphicOID().ToString(), new double[] { x - radius, y - radius, x + radius, y + radius }, itemRange); |
|
3488 |
} |
|
3489 |
|
|
3490 |
LMConnectors GetConnectors() |
|
3491 |
{ |
|
3492 |
LMAFilter filter = new LMAFilter(); |
|
3493 |
LMACriterion criterion1 = new LMACriterion(); |
|
3494 |
criterion1.SourceAttributeName = "SP_DRAWINGID"; |
|
3495 |
criterion1.Operator = "="; |
|
3496 |
criterion1.set_ValueAttribute(dataSource.PIDMgr.Drawing.ID); |
|
3497 |
criterion1.Conjunctive = true; |
|
3498 |
filter.get_Criteria().Add(criterion1); |
|
3499 |
filter.ItemType = "Connector"; |
|
3500 |
|
|
3501 |
LMACriterion criterion2 = new LMACriterion(); |
|
3502 |
criterion2.SourceAttributeName = "ITEMSTATUS"; |
|
3503 |
criterion2.Operator = "="; |
|
3504 |
criterion2.set_ValueAttribute("1"); |
|
3505 |
criterion2.Conjunctive = true; |
|
3506 |
filter.get_Criteria().Add(criterion2); |
|
3507 |
|
|
3508 |
LMACriterion criterion3 = new LMACriterion(); |
|
3509 |
criterion3.SourceAttributeName = "INSTOCKPILE"; |
|
3510 |
criterion3.Operator = "="; |
|
3511 |
criterion3.set_ValueAttribute("1"); |
|
3512 |
criterion3.Conjunctive = true; |
|
3513 |
filter.get_Criteria().Add(criterion3); |
|
3514 |
|
|
3515 |
LMConnectors items = new LMConnectors(); |
|
3516 |
items.Collect(dataSource, Filter: filter); |
|
3517 |
|
|
3518 |
ReleaseCOMObjects(filter); |
|
3519 |
ReleaseCOMObjects(criterion1); |
|
3520 |
ReleaseCOMObjects(criterion2); |
|
3521 |
ReleaseCOMObjects(criterion3); |
|
3522 |
|
|
3523 |
return items; |
|
3524 |
} |
|
3525 |
LMSymbols GetSymbols() |
|
3526 |
{ |
|
3527 |
LMAFilter filter = new LMAFilter(); |
|
3528 |
LMACriterion criterion1 = new LMACriterion(); |
|
3529 |
criterion1.SourceAttributeName = "SP_DRAWINGID"; |
|
3530 |
criterion1.Operator = "="; |
|
3531 |
criterion1.set_ValueAttribute(dataSource.PIDMgr.Drawing.ID); |
|
3532 |
criterion1.Conjunctive = true; |
|
3533 |
filter.get_Criteria().Add(criterion1); |
|
3534 |
filter.ItemType = "Symbol"; |
|
3535 |
|
|
3536 |
LMACriterion criterion2 = new LMACriterion(); |
|
3537 |
criterion2.SourceAttributeName = "ITEMSTATUS"; |
|
3538 |
criterion2.Operator = "="; |
|
3539 |
criterion2.set_ValueAttribute("1"); |
|
3540 |
criterion2.Conjunctive = true; |
|
3541 |
filter.get_Criteria().Add(criterion2); |
|
3542 |
|
|
3543 |
LMACriterion criterion3 = new LMACriterion(); |
|
3544 |
criterion3.SourceAttributeName = "INSTOCKPILE"; |
|
3545 |
criterion3.Operator = "="; |
|
3546 |
criterion3.set_ValueAttribute("1"); |
|
3547 |
criterion3.Conjunctive = true; |
|
3548 |
filter.get_Criteria().Add(criterion3); |
|
3549 |
|
|
3550 |
LMSymbols items = new LMSymbols(); |
|
3551 |
items.Collect(dataSource, Filter: filter); |
|
3552 |
|
|
3553 |
ReleaseCOMObjects(filter); |
|
3554 |
ReleaseCOMObjects(criterion1); |
|
3555 |
ReleaseCOMObjects(criterion2); |
|
3556 |
ReleaseCOMObjects(criterion3); |
|
3557 |
|
|
3558 |
return items; |
|
3559 |
} |
|
3560 |
|
|
3561 |
private void SetConnectorAndSymbolRange() |
|
3562 |
{ |
|
3563 |
itemRange = new List<double[]>(); |
|
3564 |
|
|
3565 |
LMConnectors connectors = GetConnectors(); |
|
3566 |
foreach (LMConnector connector in connectors) |
|
3567 |
{ |
|
3568 |
List<double[]> vertices = GetConnectorVertices(connector); |
|
3569 |
for (int i = 0; i < vertices.Count - 1; i++) |
|
3570 |
{ |
|
3571 |
double[] point1 = vertices[i]; |
|
3572 |
double[] point2 = vertices[i + 1]; |
|
3573 |
double x1 = Math.Min(point1[0], point2[0]), y1 = Math.Min(point1[1], point2[1]), x2 = Math.Max(point1[0], point2[0]), y2 = Math.Max(point1[1], point2[1]); |
|
3574 |
double gap = 0.0001d; |
|
3575 |
itemRange.Add(new double[] { x1 - gap, y1 - gap, x2 + gap, y2 + gap }); |
|
3576 |
} |
|
3577 |
ReleaseCOMObjects(connector); |
|
3578 |
} |
|
3579 |
ReleaseCOMObjects(connectors); |
|
3580 |
|
|
3581 |
LMSymbols symbols = GetSymbols(); |
|
3582 |
foreach (LMSymbol symbol in symbols) |
|
3583 |
{ |
|
3584 |
string oid = symbol.get_GraphicOID().ToString(); |
|
3585 |
DrawingObjectBase drawingObject = radApp.ActiveDocument.ActiveSheet.DrawingObjects[oid]; |
|
3586 |
if (drawingObject != null) |
|
3587 |
{ |
|
3588 |
double x1, y1, x2, y2; |
|
3589 |
drawingObject.Range(out x1, out y1, out x2, out y2); |
|
3590 |
itemRange.Add(new double[] { x1, y1, x2, y2 }); |
|
3591 |
} |
|
3592 |
|
|
3593 |
ReleaseCOMObjects(symbol); |
|
3594 |
} |
|
3595 |
ReleaseCOMObjects(symbols); |
|
3596 |
} |
|
3597 |
|
|
3598 |
private void MoveSegmentBestLocation(string oid, double[] segmentRange, List<double[]> allRanges) |
|
3599 |
{ |
|
3600 |
double minValue = Math.Min(segmentRange[2] - segmentRange[0], segmentRange[3] - segmentRange[1]); |
|
3601 |
double maxValue = Math.Max(segmentRange[2] - segmentRange[0], segmentRange[3] - segmentRange[1]); |
|
3602 |
|
|
3603 |
double maxX = 0, maxY = 0; |
|
3604 |
maxX = maxValue * 10; |
|
3605 |
maxY = minValue * 10; |
|
3606 |
|
|
3607 |
double move = minValue / 10d; |
|
3608 |
double textGap = minValue / 3d; |
|
3609 |
segmentRange = new double[] { segmentRange[0] - textGap, segmentRange[1] - textGap, segmentRange[2] + textGap, segmentRange[3] + textGap }; |
|
3610 |
|
|
3611 |
|
|
3612 |
List<double[]> containRanges = new List<double[]>(); |
|
3613 |
double[] findRange = new double[] { |
|
3614 |
segmentRange[0] - maxX, segmentRange[1] - maxY, |
|
3615 |
segmentRange[2] + maxX, segmentRange[3] + maxY}; |
|
3616 |
|
|
3617 |
foreach (var range in allRanges) |
|
3618 |
if (SPPIDUtil.IsOverlap(findRange, range)) |
|
3619 |
containRanges.Add(range); |
|
3620 |
|
|
3621 |
double movePointX = 0, movePointY = 0, distance = double.MaxValue; |
|
3622 |
for (double x = 0; x < maxX; x = x + move) |
|
3623 |
for (double y = 0; y < maxY; y = y + move) |
|
3624 |
for (int i = 0; i < 4; i++) |
|
3625 |
{ |
|
3626 |
double tempX = 0d, tempY = 0d; |
|
3627 |
switch (i) |
|
3628 |
{ |
|
3629 |
case 0: |
|
3630 |
tempX = x; |
|
3631 |
tempY = y; |
|
3632 |
break; |
|
3633 |
case 1: |
|
3634 |
tempX = -x; |
|
3635 |
tempY = y; |
|
3636 |
break; |
|
3637 |
case 2: |
|
3638 |
tempX = -x; |
|
3639 |
tempY = -y; |
|
3640 |
break; |
|
3641 |
case 3: |
|
3642 |
tempX = x; |
|
3643 |
tempY = -y; |
|
3644 |
break; |
|
3645 |
default: |
|
3646 |
break; |
|
3647 |
} |
|
3648 |
|
|
3649 |
bool result = true; |
|
3650 |
double[] movedRange = new double[] { segmentRange[0] + tempX, segmentRange[1] + tempY, segmentRange[2] + tempX, segmentRange[3] + tempY }; |
|
3651 |
foreach (double[] range in containRanges) |
|
3652 |
{ |
|
3653 |
if (SPPIDUtil.IsOverlap(range, movedRange)) |
|
3654 |
{ |
|
3655 |
result = false; |
|
3656 |
break; |
|
3657 |
} |
|
3658 |
} |
|
3659 |
|
|
3660 |
if (result) |
|
3661 |
{ |
|
3662 |
//double tempDistance = Utils.CalcDistance(new double[] { 0, 0, 0 }, new double[] { tempX, tempY, 0 }); |
|
3663 |
double tempDistance = SPPIDUtil.CalcPointToPointdDistance(0, 0, tempX, tempY); |
|
3664 |
bool bChange = false; |
|
3665 |
if (distance > tempDistance) |
|
3666 |
bChange = true; |
|
3667 |
else if (distance.Equals(tempDistance) && (movePointX.Equals(0d) || movePointY.Equals(0d))) |
|
3668 |
bChange = true; |
|
3669 |
|
|
3670 |
if (bChange) |
|
3671 |
{ |
|
3672 |
distance = tempDistance; |
|
3673 |
movePointX = tempX; |
|
3674 |
movePointY = tempY; |
|
3675 |
} |
|
3676 |
} |
|
3677 |
} |
|
3678 |
|
|
3679 |
DependencyObject dependency = radApp.ActiveDocument.ActiveSheet.DrawingObjects[oid] as DependencyObject; |
|
3680 |
if (dependency != null) |
|
3681 |
{ |
|
3682 |
radApp.ActiveSelectSet.RemoveAll(); |
|
3683 |
radApp.ActiveSelectSet.Add(dependency); |
|
3684 |
Ingr.RAD2D.Transform transform = dependency.GetTransform(); |
|
3685 |
transform.DefineByMove2d(movePointX, movePointY); |
|
3686 |
radApp.ActiveSelectSet.Transform(transform, true); |
|
3687 |
radApp.ActiveSelectSet.RemoveAll(); |
|
3688 |
} |
|
3689 |
} |
|
3690 |
|
|
3308 | 3691 |
private LMConnector FindBreakLineTarget(object targetObj, object connectedObj) |
3309 | 3692 |
{ |
3310 | 3693 |
LMConnector targetConnector = null; |
... | ... | |
4613 | 4996 |
vertices = vertices.FindAll(x => x[0] > 0 && x[1] > 0); |
4614 | 4997 |
double[] point = vertices[vertices.Count - 1]; |
4615 | 4998 |
Array array = new double[] { 0, point[0], point[1] }; |
4616 |
LMLabelPersist _LMLabelPersist = _placement.PIDPlaceLabel(mappingPath, ref array, LabeledItem: connector.AsLMRepresentation()); |
|
4999 |
LMLabelPersist _LMLabelPersist = _placement.PIDPlaceLabel(mappingPath, ref array, null, null, LabeledItem: connector.AsLMRepresentation());
|
|
4617 | 5000 |
if (_LMLabelPersist != null) |
4618 | 5001 |
{ |
4619 | 5002 |
_LMLabelPersist.Commit(); |
내보내기 Unified diff