프로젝트

일반

사용자정보

개정판 5adeae43

ID5adeae43a8de9f86ab903fa6972aad89872f9dc9
상위 e5cf29db
하위 f7fbb5f3

함의성이(가) 2년 이상 전에 추가함

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

클립보드 이미지 추가 (최대 크기: 500 MB)