프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

hytos / DTI_PID / SPPIDConverter / AutoModeling.vb @ 9133d5d8

이력 | 보기 | 이력해설 | 다운로드 (53 KB)

1
Imports System.IO
2
Imports System.Data.SqlClient
3
Imports System.Data.SQLite
4
Imports Plaice
5
Imports Llama
6
Imports ComUtil.MessageLog.CEventLog
7

    
8
Imports System.Threading
9
Public Class AutoModeling
10

    
11
    Public Shared CDrawing As Drawing
12
    Private PipeRunPoint As Dictionary(Of String, List(Of Pointd))
13
    Private sCnt As Integer
14
    Friend WithEvents ListBox_Result As ListBox
15

    
16
    Public Sub New(ByVal cDrawing As Drawing, ByVal ListBox_Result As ListBox)
17
        AutoModeling.CDrawing = cDrawing
18
        Me.PipeRunPoint = New Dictionary(Of String, List(Of Pointd))
19
        Me.ListBox_Result = ListBox_Result
20
    End Sub
21

    
22

    
23
    Public Sub StartModeling()
24
        Try
25
            Dim CGroupList As List(Of ItemGroup) = GetGroupList()
26
            DrawItemGroup(CGroupList)
27
            DrawTextItem()
28

    
29
        Catch ex As Exception
30
            Console.WriteLine(ex.Message)
31
        End Try
32
    End Sub
33
    Private Sub DrawLineNumber(ByVal lineUID As String)
34
        Dim lineNumbers As List(Of LineNumber) = CDrawing.LINENUMBERS
35

    
36
        For Each lineNumber As LineNumber In lineNumbers
37
            If lineNumber.CONNECTLINE = lineUID Then
38
                Dim _targetLine As Line = FindLineByUID(CDrawing.LINES, lineNumber.CONNECTLINE)
39
                If _targetLine IsNot Nothing Then
40
                    lineNumber.TARGETLINE = _targetLine
41
                    lineNumber.Modeling()
42
                    lineNumber.SetAttribute()
43
                End If
44
            End If
45
        Next
46
    End Sub
47

    
48
    Private Sub DrawTextItem()
49
        Dim _texts As List(Of Text) = CDrawing.TEXTS
50

    
51
        For Each _text As Text In _texts
52
            If _text.NAME = "TEXT" And String.IsNullOrEmpty(_text.OWNER) Then
53
                _text.Modeling()
54
            ElseIf _text.NAME = "SIZE" And String.IsNullOrEmpty(_text.OWNER) = False Then
55
                _text.Modeling()
56
                _text.SetAttribute()
57
            End If
58
        Next
59
    End Sub
60

    
61
    Private Sub IfContainLineNumber(ByVal lineUID As String)
62
        Dim lineNumbers As List(Of LineNumber) = CDrawing.LINENUMBERS
63

    
64
        For Each lineNumber As LineNumber In lineNumbers
65
            If lineNumber.CONNECTLINE = lineUID Then
66
                Dim _targetLine As Line = FindLineByUID(CDrawing.LINES, lineNumber.CONNECTLINE)
67
                If _targetLine IsNot Nothing Then
68
                    lineNumber.TARGETLINE = _targetLine
69
                    lineNumber.Modeling()
70
                    lineNumber.SetAttribute()
71
                End If
72

    
73
                Exit For
74
            End If
75
        Next
76
    End Sub
77

    
78
    Private Sub IfContainSizeLabel(ByVal lineUID As String)
79
        Dim _texts As List(Of Text) = CDrawing.TEXTS
80
        For Each _text As Text In _texts
81
            If _text.OWNER = lineUID Then
82
                _text.SetAttribute()
83
                Exit For
84
            End If
85
        Next
86
    End Sub
87

    
88
    Private Sub DrawItemGroup(ByVal CGroupList As List(Of ItemGroup))
89
        sCnt = 1
90
        For Each itemGroup As ItemGroup In CGroupList
91
            DrawGroup_Symbol(itemGroup)
92
        Next
93
        sCnt = 1
94
        While CGroupList.Count > 0
95
            For Each itemGroup As ItemGroup In CGroupList
96
                If IsCanDraw(itemGroup) Then
97
                    DrawGroup_Line(itemGroup)
98
                    'DrawGroup(itemGroup)
99
                    CGroupList.Remove(itemGroup)
100
                    Exit For
101
                Else
102
                    Continue For
103
                End If
104
            Next
105
        End While
106
    End Sub
107

    
108
    Private Sub DrawGroup(ByVal itemGroup As ItemGroup)
109

    
110
        If DrawGroup_Symbol(itemGroup) Then
111
            DrawGroup_Line(itemGroup)
112
        Else
113
            Return
114
        End If
115
    End Sub
116

    
117
    Private Function DrawGroup_Symbol(ByVal itemGroup As ItemGroup) As Boolean
118
        Dim list As List(Of Object) = itemGroup.Group
119
        Dim prevSymbol As Symbol = Nothing
120
        Dim prevIndex As Integer = 0
121

    
122
        For index = 0 To list.Count - 1
123
            Dim obj As Object = list(index)
124
            If TypeOf (obj) Is Symbol Then
125
                Dim symbol As Symbol = obj
126
                '' PrevSymbol과 현재의 Symbol 비교하여 그리기
127
                If prevSymbol IsNot Nothing Then
128
                    Dim prevSlope As SlopType = SlopType.NONE
129
                    For lineIndex = prevIndex + 1 To index - 1
130
                        Dim _line As Line = list(lineIndex)
131
                        If prevSlope = SlopType.NONE Then
132
                            prevSlope = _line.SLOPTYPE
133
                        ElseIf prevSlope <> _line.SLOPTYPE Then
134
                            prevSlope = SlopType.NONE
135
                            Exit For
136
                        End If
137
                    Next
138
                    If prevSlope = SlopType.HORIZONTAL Then
139
                        symbol.LOCATION_Y = prevSymbol.SPPID_ITEM_OBJECT.YCoordinate
140
                    ElseIf prevSlope = SlopType.VERTICAL Then
141
                        symbol.LOCATION_X = prevSymbol.SPPID_ITEM_OBJECT.XCoordinate
142
                    End If
143
                End If
144
                SetListBoxItems(ListBox_Result, "Create Symbol (" + sCnt.ToString + "/" + CDrawing.SYMBOLS.Count.ToString + ") UID : " + symbol.UID)
145
                sCnt += 1
146
                symbol.Modeling()
147
                If symbol.SPPID_ITEM_OBJECT IsNot Nothing Then
148
                    prevSymbol = symbol
149
                    prevIndex = index
150
                Else
151
                    Return False
152
                End If
153
            End If
154
        Next
155
        Return True
156
    End Function
157

    
158
    Private Function DrawGroup_Line(ByVal itemGroup As ItemGroup) As Boolean
159
        Dim list As List(Of Object) = itemGroup.Group
160
        Dim _Placement As Placement = New Placement
161
        Dim allLine As List(Of Line) = New List(Of Line)
162
        Dim lineList As List(Of Line) = New List(Of Line)
163
        Dim pipeRuns As LMPipeRuns = New LMPipeRuns
164

    
165
        For index = 0 To list.Count - 1
166
            Dim obj As Object = list(index)
167

    
168
            If TypeOf (obj) Is Line Then
169
                Dim line As Line = obj
170
                lineList.Add(line)
171
                allLine.Add(line)
172
                SetListBoxItems(ListBox_Result, "Grouping Line (" + sCnt.ToString + "/" + CDrawing.LINES.Count.ToString + ") UID : " + line.UID)
173
                sCnt += 1
174
            ElseIf lineList.Count > 0 Then
175
                SetListBoxItems(ListBox_Result, "DrawLine : " + lineList.Count.ToString)
176
                Dim lmConnector As LMConnector = DrawLine(GetLinePoints(lineList), lineList(0).SPPIDMAPPINGNAME)
177
                If lmConnector IsNot Nothing Then
178
                    For Each _line As Line In lineList
179
                        _line.LMCONNECTOR_MODELID = lmConnector.ModelItemID
180
                        IfContainLineNumber(_line.UID)
181
                        IfContainSizeLabel(_line.UID)
182
                    Next
183
                    pipeRuns.Add(_Placement.PIDDataSource.GetPipeRun(lmConnector.ModelItemID))
184
                End If
185
                lineList = New List(Of Line)
186
            End If
187
        Next
188

    
189
        If lineList.Count > 0 Then
190
            SetListBoxItems(ListBox_Result, "DrawLine : " + lineList.Count.ToString)
191
            Dim lmConnector As LMConnector = DrawLine(GetLinePoints(lineList), lineList(0).SPPIDMAPPINGNAME)
192
            If lmConnector IsNot Nothing Then
193
                For Each _line As Line In lineList
194
                    _line.LMCONNECTOR_MODELID = lmConnector.ModelItemID
195
                    IfContainLineNumber(_line.UID)
196
                    IfContainSizeLabel(_line.UID)
197
                Next
198
                pipeRuns.Add(_Placement.PIDDataSource.GetPipeRun(lmConnector.ModelItemID))
199
            End If
200
        End If
201

    
202
        ''' Pipe Run Join
203
        'For Each run As LMPipeRun In pipeRuns
204
        '    Dim objSurvivorItem As LMAItem
205
        '    Dim prevUID As String = run.AsLMAItem.Id
206
        '    _Placement.PIDAutoJoin(run.AsLMAItem, AutoJoinEndConstants.autoJoin_Both, objSurvivorItem)
207
        '    If objSurvivorItem IsNot Nothing Then
208
        '        Dim newUID = objSurvivorItem.Id
209
        '        For Each obj As Object In list
210
        '            If TypeOf (obj) Is Line Then
211
        '                Dim line As Line = obj
212
        '                If line.LMCONNECTOR_MODELID = prevUID Then
213
        '                    line.LMCONNECTOR_MODELID = newUID
214
        '                End If
215
        '            End If
216
        '        Next
217
        '    End If
218
        'Next
219

    
220

    
221
        ''' 일반 조인 확인 중
222
        'For index = 0 To testList.Count - 2
223
        '    If testList(index) = testList(index + 1) Then
224
        '        Continue For
225
        '    End If
226
        '    Dim run1 As LMAItem = _Placement.PIDDataSource.GetPipeRun(testList(index)).AsLMAItem
227
        '    Dim run2 As LMAItem = _Placement.PIDDataSource.GetPipeRun(testList(index + 1)).AsLMAItem
228
        '    _Placement.PIDJoinRuns(run2, run1)
229
        '    testList(index) = run1.Id
230
        '    Console.WriteLine(run1.Id)
231
        '    testList(index + 1) = run2.Id
232
        '    Console.WriteLine(run2.Id)
233
        'Next
234

    
235

    
236

    
237

    
238

    
239

    
240
        '' Branch를 위해서 만들어진 Points 정리
241
        SetGroupPoints(allLine)
242

    
243
        'For Each dic In PipeRunPoint
244
        '    Dim points As List(Of Pointd) = dic.Value
245
        '    Debug.WriteLine("-----------------------------" + dic.Key + "-----------------------------")
246
        '    For Each point In points
247
        '        Debug.WriteLine(point.X.ToString + "/" + point.Y.ToString + "/" + point.PointInfo)
248
        '    Next
249
        '    Debug.WriteLine("----------------------------- end " + "-----------------------------")
250
        'Next
251

    
252
        Return True
253
    End Function
254

    
255
    Private Sub SetGroupPoints(ByVal lines As List(Of Line))
256
        'Dim _temp As List(Of String) = New List(Of String)
257

    
258
        For Each line As Line In lines
259
            '' 순서로 들어옴
260
            Dim sModelId As String = line.LMCONNECTOR_MODELID
261
            If PipeRunPoint.ContainsKey(sModelId) = False Then
262
                PipeRunPoint.Add(sModelId, New List(Of Pointd))
263
            End If
264

    
265
            Dim pointList As List(Of Pointd) = PipeRunPoint(sModelId)
266
            If pointList.Count > 0 Then
267
                Dim lastPoint As Pointd = pointList(pointList.Count - 1)
268

    
269
                Dim point1 As Pointd = New Pointd(line.START_X, line.START_Y)
270
                point1.ConnectedUID = line.CONNECTORS(0).CONNECTEDITEM
271
                point1.PointInfo = GetPointState(line.UID, point1.ConnectedUID)
272
                point1.SP_ID = GetSymbolSP_ID(point1.ConnectedUID)
273
                point1.Line = line
274

    
275
                Dim point2 As Pointd = New Pointd(line.END_X, line.END_Y)
276
                point2.ConnectedUID = line.CONNECTORS(1).CONNECTEDITEM
277
                point2.PointInfo = GetPointState(line.UID, point2.ConnectedUID)
278
                point2.SP_ID = GetSymbolSP_ID(point2.ConnectedUID)
279
                point2.Line = line
280

    
281
                If point1.ConnectedUID = lastPoint.Line.UID Then
282
                    pointList.Add(point2)
283
                ElseIf point2.ConnectedUID = lastPoint.Line.UID Then
284
                    pointList.Add(point1)
285
                ElseIf lastPoint.ConnectedUID = point1.ConnectedUID Then
286
                    pointList.Add(point1)
287
                    pointList.Add(point2)
288
                ElseIf lastPoint.ConnectedUID = point2.ConnectedUID Then
289
                    pointList.Add(point2)
290
                    pointList.Add(point1)
291
                Else
292
                    Throw New Exception("Logic Error")
293
                End If
294

    
295
            Else
296
                Dim UIDList As List(Of String) = New List(Of String)
297
                UIDList.Add(line.UID)
298
                If IsStartOrLastPointByModelId(line.CONNECTORS(0).CONNECTEDITEM, line.LMCONNECTOR_MODELID, UIDList) Then
299
                    Dim point1 As Pointd = New Pointd(line.START_X, line.START_Y)
300
                    point1.ConnectedUID = line.CONNECTORS(0).CONNECTEDITEM
301
                    point1.PointInfo = GetPointState(line.UID, point1.ConnectedUID)
302
                    point1.Line = line
303
                    point1.SP_ID = GetSymbolSP_ID(point1.ConnectedUID)
304
                    pointList.Add(point1)
305

    
306
                    Dim point2 As Pointd = New Pointd(line.END_X, line.END_Y)
307
                    point2.ConnectedUID = line.CONNECTORS(1).CONNECTEDITEM
308
                    point2.PointInfo = GetPointState(line.UID, point2.ConnectedUID)
309
                    point2.Line = line
310
                    point2.SP_ID = GetSymbolSP_ID(point2.ConnectedUID)
311
                    pointList.Add(point2)
312
                ElseIf IsStartOrLastPointByModelId(line.CONNECTORS(1).CONNECTEDITEM, line.LMCONNECTOR_MODELID, UIDList) Then
313
                    Dim point2 As Pointd = New Pointd(line.END_X, line.END_Y)
314
                    point2.ConnectedUID = line.CONNECTORS(1).CONNECTEDITEM
315
                    point2.PointInfo = GetPointState(line.UID, point2.ConnectedUID)
316
                    point2.Line = line
317
                    point2.SP_ID = GetSymbolSP_ID(point2.ConnectedUID)
318
                    pointList.Add(point2)
319

    
320
                    Dim point1 As Pointd = New Pointd(line.START_X, line.START_Y)
321
                    point1.ConnectedUID = line.CONNECTORS(0).CONNECTEDITEM
322
                    point1.PointInfo = GetPointState(line.UID, point1.ConnectedUID)
323
                    point1.Line = line
324
                    point1.SP_ID = GetSymbolSP_ID(point1.ConnectedUID)
325
                    pointList.Add(point1)
326
                Else
327
                    Throw New Exception("Logic Error")
328
                End If
329

    
330
            End If
331
        Next
332
    End Sub
333

    
334
    Private Function GetSymbolSP_ID(ByVal symbolUID As String) As String
335
        Dim symbol As Symbol = FindSymbolByUID(CDrawing.SYMBOLS, symbolUID)
336
        If symbol IsNot Nothing Then
337
            Return symbol.SPPID_ITEM_OBJECT.AsLMRepresentation.Id
338
        Else
339
            Return ""
340
        End If
341

    
342
    End Function
343

    
344
    Private Function GetPointState(ByVal lineUID As String, ByVal connectedItem As String) As String
345
        If IsBranchLine(connectedItem, lineUID, CDrawing.LINES) Then
346
            Return "BRANCH"
347
        ElseIf FindSymbolByUID(CDrawing.SYMBOLS, connectedItem) IsNot Nothing Then
348
            Return "SYMBOL"
349
        ElseIf FindLineByUID(CDrawing.LINES, connectedItem) IsNot Nothing Then
350
            Return "RUN"
351
        ElseIf String.IsNullOrEmpty(connectedItem) Then
352
            Return "RUN"
353
        ElseIf connectedItem = "None" Then
354
            Return "Run"
355
        Else
356
            Throw New Exception("Logic Error")
357
        End If
358
    End Function
359

    
360
    Private Function FindFirstOrLastLMConnector(ByVal modelId As String) As LMConnector
361
        Dim _Placement As Placement = New Placement
362
        Dim lmPipeRun As LMPipeRun = _Placement.PIDDataSource.GetPipeRun(modelId)
363

    
364
        For Each oRep As LMRepresentation In lmPipeRun.Representations
365
            If oRep.Attributes("RepresentationType").Value = "Connector" And oRep.Attributes("ItemStatus").Value = "Active" Then
366
                Dim _conn As LMConnector = _Placement.PIDDataSource.GetConnector(oRep.Id)
367

    
368
                Dim connectedItem As LMSymbol = _conn.ConnectItem1SymbolObject
369
                If connectedItem Is Nothing Then
370
                    Return _conn
371
                ElseIf connectedItem.RepresentationType.ToString = "" Then
372
                    Debug.WriteLine(connectedItem.RepresentationType.ToString)
373
                Else
374
                    Debug.WriteLine(connectedItem.RepresentationType.ToString)
375
                End If
376

    
377
                connectedItem = _conn.ConnectItem2SymbolObject
378
                If connectedItem Is Nothing Then
379
                    Return _conn
380
                ElseIf connectedItem.RepresentationType.ToString = "" Then
381
                    Debug.WriteLine(connectedItem.RepresentationType.ToString)
382
                Else
383
                    Debug.WriteLine(connectedItem.RepresentationType.ToString)
384
                End If
385

    
386
            End If
387
        Next
388

    
389
        Return Nothing
390
    End Function
391

    
392

    
393
    ''' <summary>
394
    ''' Branch, 심볼, 비어있으면 마지막 ConnectorPoint라는 것을 알아냄 - 전체 Model ID가 아닌 부분 Line 기준
395
    ''' </summary>
396
    ''' <param name="lineUID"></param>
397
    ''' <param name="connectedItem"></param>
398
    ''' <returns></returns>
399
    Private Function IsStartOrLastPointForSplitLine(ByVal lineUID As String, ByVal connectedItem As String, Optional ByVal containSymbol As Boolean = True) As Boolean
400
        If IsBranchLine(connectedItem, lineUID, CDrawing.LINES) Then
401
            Return True
402
        ElseIf FindSymbolByUID(CDrawing.SYMBOLS, connectedItem) IsNot Nothing And containSymbol Then
403
            Return True
404
        ElseIf connectedItem = "None" Then
405
            Return True
406
        ElseIf String.IsNullOrEmpty(connectedItem) Then
407
            Return True
408
        End If
409
        Return False
410
    End Function
411

    
412
    Private Function IsStartOrLastPointByModelId(ByVal connectedItemUID As String, ByVal modelId As String, ByVal UIDList As List(Of String)) As Boolean
413
        Dim connectedSymbol As Symbol = FindSymbolByUID(CDrawing.SYMBOLS, connectedItemUID)
414
        Dim connectedLine As Line = FindLineByUID(CDrawing.LINES, connectedItemUID)
415
        Dim result As Boolean = True
416

    
417
        UIDList.Add(connectedItemUID)
418

    
419
        If connectedSymbol IsNot Nothing Then
420
            For Each connector As Connector In connectedSymbol.CONNECTORS
421
                If connector.CONNECTEDITEM <> connectedItemUID Then
422
                    If UIDList.Contains(connector.CONNECTEDITEM) = False Then
423
                        If IsStartOrLastPointByModelId(connector.CONNECTEDITEM, modelId, UIDList) = False Then
424
                            result = False
425
                        End If
426
                    End If
427
                End If
428
            Next
429
        ElseIf connectedLine IsNot Nothing Then
430
            If connectedLine.LMCONNECTOR_MODELID = modelId Then
431
                result = False
432
            End If
433
        End If
434

    
435
        Return result
436
    End Function
437

    
438
    Private Function GetLinePoints(ByVal lineList As List(Of Line)) As List(Of Pointd)
439
        Try
440
            Dim points As List(Of Pointd) = GetGroupPoint(lineList)
441

    
442
            Dim startLine As Line = lineList(0)
443
            Dim endLine As Line = lineList(lineList.Count - 1)
444

    
445
            Dim startConnItem1 As String = startLine.CONNECTORS(0).CONNECTEDITEM
446
            Dim startConnItem2 As String = startLine.CONNECTORS(1).CONNECTEDITEM
447
            Dim endConnItem1 As String = endLine.CONNECTORS(0).CONNECTEDITEM
448
            Dim endConnItem2 As String = endLine.CONNECTORS(1).CONNECTEDITEM
449

    
450
            If lineList.Count = 1 Then
451
                Dim point As Pointd = points(0)
452
                point.ConnectedUID = startConnItem1
453
                points(0) = point
454
                Dim point2 As Pointd = points(1)
455
                point2.ConnectedUID = startConnItem2
456
                points(1) = point2
457
            Else
458
                Dim point As Pointd = points(0)
459
                If IsStartOrLastPointForSplitLine(startLine.UID, startConnItem1) Then
460
                    point.ConnectedUID = startConnItem1
461
                    points(0) = point
462
                ElseIf IsStartOrLastPointForSplitLine(startLine.UID, startConnItem2) Then
463
                    point.ConnectedUID = startConnItem2
464
                    points(0) = point
465
                Else
466
                    Throw New Exception("GetLinePoints")
467
                End If
468
                point = points(points.Count - 1)
469
                If IsStartOrLastPointForSplitLine(endLine.UID, endConnItem1) Then
470
                    point.ConnectedUID = endConnItem1
471
                    points(points.Count - 1) = point
472
                ElseIf IsStartOrLastPointForSplitLine(endLine.UID, endConnItem2) Then
473
                    point.ConnectedUID = endConnItem2
474
                    points(points.Count - 1) = point
475
                Else
476
                    Throw New Exception("GetLinePoints")
477
                End If
478

    
479

    
480
            End If
481

    
482
            '' 보정
483
            Dim startPoint As Pointd = points(0)
484
            Dim connSymbol As Symbol = FindSymbolByUID(CDrawing.SYMBOLS, startPoint.ConnectedUID)
485
            If connSymbol IsNot Nothing Then
486
                Dim symbolX As Double = connSymbol.SPPID_ITEM_OBJECT.XCoordinate
487
                Dim symbolY As Double = connSymbol.SPPID_ITEM_OBJECT.YCoordinate
488
                Dim nextPoint As Pointd = points(1)
489
                If IsHorizontal(startPoint, nextPoint) Then
490
                    startPoint.Y = symbolY
491
                    nextPoint.Y = symbolY
492
                Else
493
                    startPoint.X = symbolX
494
                    nextPoint.X = symbolX
495
                End If
496

    
497
                points(0) = startPoint
498
                points(1) = nextPoint
499
            End If
500

    
501
            Dim endPoint As Pointd = points(points.Count - 1)
502
            connSymbol = FindSymbolByUID(CDrawing.SYMBOLS, endPoint.ConnectedUID)
503
            If connSymbol IsNot Nothing Then
504
                Dim symbolX As Double = connSymbol.SPPID_ITEM_OBJECT.XCoordinate
505
                Dim symbolY As Double = connSymbol.SPPID_ITEM_OBJECT.YCoordinate
506
                Dim nextPoint As Pointd = points(points.Count - 2)
507
                If IsHorizontal(endPoint, nextPoint) Then
508
                    endPoint.Y = symbolY
509
                    nextPoint.Y = symbolY
510
                Else
511
                    endPoint.X = symbolX
512
                    nextPoint.X = symbolX
513
                End If
514

    
515
                points(points.Count - 1) = endPoint
516
                points(points.Count - 2) = nextPoint
517
            End If
518

    
519

    
520
            Return points
521

    
522
        Catch ex As Exception
523
            Debug.WriteLine(ex.Message)
524
        End Try
525

    
526
    End Function
527

    
528
    Class Pointd
529
        Public Sub New(ByVal X As Double, ByVal Y As Double)
530
            Me.X = X
531
            Me.Y = Y
532
        End Sub
533
        Public X As Double
534
        Public Y As Double
535
        Public ConnectedUID As String
536
        Public PointInfo As String
537
        Public Line As Line
538
        Public SP_ID As String
539
    End Class
540

    
541
    Private Function GetGroupPoint(ByVal group As List(Of Line)) As List(Of Pointd)
542

    
543
        Dim resultLine As List(Of Tuple(Of Line, Boolean)) = New List(Of Tuple(Of Line, Boolean))
544
        Dim _lines As List(Of Tuple(Of Line, Boolean)) = New List(Of Tuple(Of Line, Boolean))
545
        For Each line As Line In group
546
            Dim tuple As Tuple(Of Line, Boolean) = New Tuple(Of Line, Boolean)(line, IsHorizontal(line))
547
            _lines.Add(tuple)
548
        Next
549

    
550
        For Each tuple As Tuple(Of Line, Boolean) In _lines
551
            If resultLine.Count = 0 Then
552
                resultLine.Add(tuple)
553
            Else
554
                Dim prevTuple As Tuple(Of Line, Boolean) = resultLine(resultLine.Count - 1)
555

    
556
                If prevTuple.Item2 = tuple.Item2 Then
557
                    resultLine.Remove(prevTuple)
558
                    resultLine.Add(mergeLine(tuple.Item1, prevTuple.Item1, tuple.Item2))
559
                Else
560
                    resultLine.Add(tuple)
561
                End If
562
            End If
563
        Next
564

    
565
        Dim pointList As List(Of Pointd) = New List(Of Pointd)
566
        For Each tuple As Tuple(Of Line, Boolean) In resultLine
567
            If pointList.Count = 0 Then
568
                Dim line As Line = tuple.Item1
569

    
570
                Dim point1 As Pointd = New Pointd(line.START_X, line.START_Y)
571
                Dim point2 As Pointd = New Pointd(line.END_X, line.END_Y)
572

    
573
                pointList.Add(point1)
574
                pointList.Add(point2)
575
            Else
576
                Dim line As Line = tuple.Item1
577
                Dim isHorizontal As Boolean = tuple.Item2
578

    
579
                Dim prevPoint1 As Pointd = pointList(pointList.Count - 2)
580
                Dim prevPoint2 As Pointd = pointList(pointList.Count - 1)
581
                Dim currPoint1 As Pointd = New Pointd(line.START_X, line.START_Y)
582
                Dim currPoint2 As Pointd = New Pointd(line.END_X, line.END_Y)
583

    
584
                ''제일 작은 조합의 반대편 prevPoint를 넣어야함
585
                Dim distance = CalcDistance(prevPoint1, currPoint1)
586
                Dim prev = True
587
                Dim curr = True
588

    
589
                If distance > CalcDistance(prevPoint1, currPoint2) Then
590
                    distance = CalcDistance(prevPoint1, currPoint2)
591
                    curr = False
592
                End If
593

    
594
                If distance > CalcDistance(prevPoint2, currPoint1) Then
595
                    distance = CalcDistance(prevPoint2, currPoint1)
596
                    prev = False
597
                    curr = True
598
                End If
599

    
600
                If distance > CalcDistance(prevPoint2, currPoint2) Then
601
                    distance = CalcDistance(prevPoint2, currPoint2)
602
                    prev = False
603
                    curr = False
604
                End If
605

    
606
                pointList.RemoveAt(pointList.Count - 2)
607
                pointList.RemoveAt(pointList.Count - 1)
608

    
609
                ' 지금은 수평 / 이전 수직
610
                If isHorizontal Then
611
                    If prev Then
612
                        pointList.Add(prevPoint2)
613

    
614
                        If curr Then
615
                            Dim newPoint As Pointd = New Pointd(prevPoint2.X, currPoint2.Y)
616
                            pointList.Add(newPoint)
617

    
618
                            pointList.Add(currPoint2)
619
                        Else
620
                            Dim newPoint As Pointd = New Pointd(prevPoint2.X, currPoint1.Y)
621
                            pointList.Add(newPoint)
622

    
623
                            pointList.Add(currPoint1)
624
                        End If
625
                    Else
626
                        pointList.Add(prevPoint1)
627

    
628
                        If curr Then
629
                            Dim newPoint As Pointd = New Pointd(prevPoint1.X, currPoint2.Y)
630
                            pointList.Add(newPoint)
631

    
632
                            pointList.Add(currPoint2)
633
                        Else
634
                            Dim newPoint As Pointd = New Pointd(prevPoint1.X, currPoint1.Y)
635
                            pointList.Add(newPoint)
636

    
637
                            pointList.Add(currPoint1)
638
                        End If
639
                    End If
640
                    '지금은 수직 / 이전 수평
641
                Else
642
                    If prev Then
643
                        pointList.Add(prevPoint2)
644

    
645
                        If curr Then
646
                            Dim newPoint As Pointd = New Pointd(currPoint2.X, prevPoint2.Y)
647
                            pointList.Add(newPoint)
648

    
649
                            pointList.Add(currPoint2)
650
                        Else
651
                            Dim newPoint As Pointd = New Pointd(currPoint1.X, prevPoint2.Y)
652
                            pointList.Add(newPoint)
653

    
654
                            pointList.Add(currPoint1)
655
                        End If
656
                    Else
657
                        pointList.Add(prevPoint1)
658

    
659
                        If curr Then
660
                            Dim newPoint As Pointd = New Pointd(currPoint2.X, prevPoint1.Y)
661
                            pointList.Add(newPoint)
662

    
663
                            pointList.Add(currPoint2)
664
                        Else
665
                            Dim newPoint As Pointd = New Pointd(currPoint1.X, prevPoint1.Y)
666
                            pointList.Add(newPoint)
667

    
668
                            pointList.Add(currPoint1)
669
                        End If
670
                    End If
671
                End If
672
            End If
673
        Next
674

    
675
        Return pointList
676
    End Function
677

    
678
    Private Function IsHorizontal(ByVal point1 As Pointd, ByVal point2 As Pointd) As Boolean
679
        If point1.X - point2.X = 0 Then
680
            Return False
681
        Else
682
            Dim angle = Math.Atan(Math.Abs(point2.Y - point1.Y) / Math.Abs(point2.X - point1.X)) * 180 / Math.PI
683
            If angle < 10 Then
684
                Return True
685
            Else
686
                Return False
687
            End If
688
        End If
689
    End Function
690

    
691
    Private Function IsHorizontal(ByVal line As Line)
692
        If line.END_X - line.START_X = 0 Then
693
            Return False
694
        Else
695
            Dim angle = Math.Atan(Math.Abs(line.END_Y - line.START_Y) / Math.Abs(line.END_X - line.START_X)) * 180 / Math.PI
696
            If angle < 10 Then
697
                Return True
698
            Else
699
                Return False
700
            End If
701
        End If
702
    End Function
703

    
704
    Private Function mergeLine(line1 As Line, line2 As Line, isHorizontal As Boolean) As Tuple(Of Line, Boolean)
705
        If isHorizontal Then
706
            Dim min As Double = Math.Min(line1.START_X, Math.Min(line1.END_X, Math.Min(line2.START_X, line2.END_X)))
707
            Dim max As Double = Math.Max(line1.START_X, Math.Max(line1.END_X, Math.Max(line2.START_X, line2.END_X)))
708

    
709
            Dim nLine As Line = New Line()
710
            nLine.START_X = min
711
            nLine.START_Y = line1.START_Y
712
            nLine.END_X = max
713
            nLine.END_Y = line1.START_Y
714

    
715
            Dim tuple As Tuple(Of Line, Boolean) = New Tuple(Of Line, Boolean)(nLine, isHorizontal)
716
            Return tuple
717
        Else
718
            Dim min As Double = Math.Min(line1.START_Y, Math.Min(line1.END_Y, Math.Min(line2.START_Y, line2.END_Y)))
719
            Dim max As Double = Math.Max(line1.START_Y, Math.Max(line1.END_Y, Math.Max(line2.START_Y, line2.END_Y)))
720

    
721
            Dim nLine As Line = New Line()
722
            nLine.START_X = line1.START_X
723
            nLine.START_Y = min
724
            nLine.END_X = line1.START_X
725
            nLine.END_Y = max
726

    
727
            Dim tuple As Tuple(Of Line, Boolean) = New Tuple(Of Line, Boolean)(nLine, isHorizontal)
728
            Return tuple
729
        End If
730

    
731
    End Function
732

    
733
    Private Function CalcDistance(ByVal point1 As Pointd, ByVal point2 As Pointd) As Double
734
        Return Math.Pow(Math.Sqrt(Math.Abs(point1.X - point2.X)) + Math.Sqrt(Math.Abs(point1.Y - point2.Y)), 0.5)
735
    End Function
736

    
737

    
738
    Private Function DrawSymbol(ByVal symbol As Symbol) As LMSymbol
739
        Dim _Placement As Placement = New Placement
740
        Dim sysPath = symbol.SPPIDMAPPINGNAME
741
        Dim _lmSymbol As LMSymbol = Nothing
742

    
743
        If sysPath <> "" Then
744
            Dim connectSymbol As LMSymbol = Nothing
745
            For Each connector As Connector In symbol.CONNECTORS
746
                If String.IsNullOrEmpty(connector.CONNECTEDITEM) = False Or connector.CONNECTEDITEM <> "None" Then
747
                    Dim _sym As Symbol = FindSymbolByUID(CDrawing.SYMBOLS, connector.CONNECTEDITEM)
748
                    If _sym IsNot Nothing Then
749
                        If _sym.SPPID_ITEM_OBJECT IsNot Nothing Then
750
                            connectSymbol = _sym.SPPID_ITEM_OBJECT
751
                            Exit For
752
                        End If
753
                    End If
754
                End If
755
            Next
756
            If connectSymbol IsNot Nothing Then
757
                _lmSymbol = _Placement.PIDPlaceSymbol(sysPath, symbol.LOCATION_X, symbol.LOCATION_Y, Rotation:=symbol.ANGLE, Mirror:=symbol.MIRROR, TargetItem:=connectSymbol)
758
            Else
759
                _lmSymbol = _Placement.PIDPlaceSymbol(sysPath, symbol.LOCATION_X, symbol.LOCATION_Y, Rotation:=symbol.ANGLE, Mirror:=symbol.MIRROR)
760
            End If
761
            _lmSymbol.Commit()
762

    
763
            '' Check Child
764
            For Each _child As String In symbol.CHILD
765
                Dim arrChild As String() = _child.Split(",")
766
                Dim arrow As String = arrChild(0)
767
                Dim mappingName As String = arrChild(1)
768

    
769
                Dim childAngle = 0
770
                If arrow = "UP" Then
771
                    childAngle = 0
772
                ElseIf arrow = "RIGHT" Then
773
                    childAngle = 90
774
                ElseIf arrow = "DOWN" Then
775
                    childAngle = 180
776
                Else
777
                    childAngle = 270
778
                End If
779

    
780
                Dim _childLmSymbol As LMSymbol = _Placement.PIDPlaceSymbol(mappingName, symbol.LOCATION_X, symbol.LOCATION_Y, Rotation:=childAngle, TargetItem:=_lmSymbol)
781
                symbol.CHILD_SPPID_ITEM_OBJECT.Add(_childLmSymbol)
782
            Next
783

    
784
            Debug.WriteLine(symbol.LOCATION_X.ToString + "," + symbol.LOCATION_Y.ToString + "/" + symbol.UID + "/" + symbol.SIZE)
785
        End If
786

    
787
        Return _lmSymbol
788
    End Function
789

    
790
    Private Function DrawLine(ByVal points As List(Of Pointd), ByVal PipeSystemPath As String) As LMConnector
791
        Dim _Placement As Placement = New Placement
792
        Dim objItem As LMAItem = _Placement.PIDCreateItem(PipeSystemPath)
793
        Dim _lmConnector As LMConnector = Nothing
794
        Dim objInputs As PlaceRunInputs = New PlaceRunInputs
795
        Dim branchPoint As Pointd = Nothing
796
        Dim branchIndex As Integer = 0
797
        Dim branch_SP_ID_List As List(Of String) = New List(Of String)
798

    
799
        Try
800
            For index = 0 To points.Count - 1
801
                Dim point As Pointd = points(index)
802
                If index = 0 Or index = points.Count - 1 Then
803

    
804
                    Dim targetSymbol As Symbol = FindSymbolByUID(CDrawing.SYMBOLS, point.ConnectedUID)
805
                    Dim targetLine As Line = FindLineByUID(CDrawing.LINES, point.ConnectedUID)
806
                    If targetSymbol IsNot Nothing Then
807
                        objInputs.AddSymbolTarget(targetSymbol.SPPID_ITEM_OBJECT, point.X, point.Y)
808
                    ElseIf targetLine IsNot Nothing Then
809
                        '찾아야함'
810
                        If String.IsNullOrEmpty(targetLine.LMCONNECTOR_MODELID) Then
811
                            Console.WriteLine("targetLine.LMCONNECTOR_MODELID")
812
                        End If
813
                        Dim resultTuple As Tuple(Of LMConnector, Integer) = GetTargetLMConnector(targetLine.LMCONNECTOR_MODELID, point)
814
                        If resultTuple IsNot Nothing Then
815
                            objInputs.AddConnectorTarget(resultTuple.Item1, point.X, point.Y)
816
                            branchPoint = New Pointd(point.X, point.Y)
817
                            branchPoint.PointInfo = "BRANCH"
818
                            branchPoint.Line = targetLine
819
                            branchIndex = resultTuple.Item2
820
                            'branchPoint.
821

    
822
                            Dim run As LMPipeRun = _Placement.PIDDataSource.GetPipeRun(targetLine.LMCONNECTOR_MODELID)
823
                            For Each oRep As LMRepresentation In run.Representations
824
                                If oRep.Attributes("RepresentationType").Value = "Branch" And oRep.Attributes("ItemStatus").Value = "Active" Then
825
                                    branch_SP_ID_List.Add(oRep.Id)
826
                                End If
827
                            Next
828
                        Else
829
                            Console.WriteLine("target lmconnector error : " + targetLine.UID)
830
                            objInputs.AddPoint(point.X, point.Y)
831
                        End If
832
                    Else
833
                        objInputs.AddPoint(point.X, point.Y)
834
                    End If
835

    
836
                Else
837
                    objInputs.AddPoint(point.X, point.Y)
838
                End If
839
            Next
840
            _lmConnector = _Placement.PIDPlaceRun(objItem, objInputs)
841
            _lmConnector.Commit()
842

    
843
            If branchPoint IsNot Nothing Then
844
                Dim run As LMPipeRun = _Placement.PIDDataSource.GetPipeRun(branchPoint.Line.LMCONNECTOR_MODELID)
845
                For Each oRep As LMRepresentation In run.Representations
846
                    If oRep.Attributes("RepresentationType").Value = "Branch" And oRep.Attributes("ItemStatus").Value = "Active" Then
847
                        If branch_SP_ID_List.Contains(oRep.Id) = False Then
848
                            branchPoint.SP_ID = oRep.Id
849
                            PipeRunPoint(branchPoint.Line.LMCONNECTOR_MODELID).Insert(branchIndex, branchPoint)
850
                            Exit For
851
                        End If
852
                    End If
853
                Next
854
            End If
855
        Catch ex As Exception
856
            Console.WriteLine(ex.Message)
857

    
858
        End Try
859

    
860
        Return _lmConnector
861
    End Function
862

    
863

    
864
    Public Function GetTargetLMConnector(ByVal ModelId As String, ByVal point As Pointd) As Tuple(Of LMConnector, Integer)
865
        Dim lmConnector As LMConnector = Nothing
866
        Dim ConnPoint1 As Pointd = Nothing
867
        Dim ConnPoint2 As Pointd = Nothing
868
        Dim insertIndex As Integer = 0
869

    
870
        Dim min As Double = 0
871
        Dim max As Double = 0
872
        Dim _tempDistance As Double = 0
873
        Dim distance As Double = Double.MaxValue
874

    
875
        Try
876
            Dim pointdList As List(Of Pointd) = PipeRunPoint(ModelId)
877

    
878
            For index = 0 To pointdList.Count - 2
879
                Dim point1 As Pointd = pointdList(index)
880
                Dim point2 As Pointd = pointdList(index + 1)
881

    
882
                If IsHorizontal(point1, point2) Then
883
                    min = Math.Min(point1.X, point2.X)
884
                    max = Math.Max(point1.X, point2.X)
885
                    _tempDistance = Math.Abs((point1.Y + point2.Y) / 2 - point.Y)
886

    
887
                    If min <= point.X And max >= point.X And _tempDistance < distance Then
888
                        ConnPoint1 = pointdList(index)
889
                        ConnPoint2 = pointdList(index + 1)
890
                        insertIndex = index + 1
891
                        distance = _tempDistance
892
                    End If
893

    
894
                Else
895
                    min = Math.Min(point1.Y, point2.Y)
896
                    max = Math.Max(point1.Y, point2.Y)
897
                    _tempDistance = Math.Abs((point1.X + point2.X) / 2 - point.X)
898

    
899
                    If min <= point.Y And max >= point.Y And _tempDistance < distance Then
900
                        ConnPoint1 = pointdList(index)
901
                        ConnPoint2 = pointdList(index + 1)
902
                        insertIndex = index + 1
903
                        distance = _tempDistance
904
                    End If
905
                End If
906
            Next
907

    
908
            If ConnPoint1 IsNot Nothing And ConnPoint2 IsNot Nothing Then
909
                If ConnPoint1.PointInfo.ToUpper = "RUN" Then
910
                    lmConnector = GetLMConnectorByPoint(ModelId, ConnPoint1)
911
                ElseIf ConnPoint2.PointInfo.ToUpper = "RUN" Then
912
                    lmConnector = GetLMConnectorByPoint(ModelId, ConnPoint2)
913
                Else
914
                    lmConnector = GetLMConnectorBySP_ID(ModelId, ConnPoint1.SP_ID, ConnPoint2.SP_ID)
915
                End If
916
            End If
917

    
918
            If lmConnector Is Nothing Then
919
                Throw New Exception("Logic Error")
920
            End If
921

    
922
            Return New Tuple(Of LMConnector, Integer)(lmConnector, insertIndex)
923
        Catch ex As Exception
924
            Debug.WriteLine(ex.Message)
925
            Return Nothing
926
        End Try
927
    End Function
928

    
929
    Private Function GetLMConnectorByPoint(ByVal ModelId As String, ByVal point As Pointd) As LMConnector
930
        Dim objPlacement As Placement = New Placement
931
        Dim objConnector As LMConnector = Nothing
932

    
933
        Dim distance As Double = Double.MaxValue
934
        Dim lmPipeRun As LMPipeRun = objPlacement.PIDDataSource.GetPipeRun(ModelId)
935
        For Each oRep As LMRepresentation In lmPipeRun.Representations
936
            If oRep.Attributes("RepresentationType").Value = "Connector" And oRep.Attributes("ItemStatus").Value = "Active" Then
937
                Dim _conn As LMConnector = objPlacement.PIDDataSource.GetConnector(oRep.Id)
938
                For Each vertex As LMConnectorVertex In _conn.ConnectorVertices
939
                    Dim _distance As Double = CalcPointToPointdDistance(point, New Pointd(vertex.XCoordinate, vertex.YCoordinate))
940

    
941
                    If _distance < distance Then
942
                        distance = _distance
943
                        objConnector = _conn
944
                    End If
945
                Next
946
            End If
947
        Next
948

    
949
        Return objConnector
950
    End Function
951

    
952
    Private Function GetLMConnectorBySP_ID(ByVal ModelId As String, ByVal SP_ID1 As String, ByVal SP_ID2 As String) As LMConnector
953
        Dim objPlacement As Placement = New Placement
954
        Dim objConnector As LMConnector = Nothing
955

    
956
        Dim distance As Double = Double.MaxValue
957
        Dim lmPipeRun As LMPipeRun = objPlacement.PIDDataSource.GetPipeRun(ModelId)
958
        For Each oRep As LMRepresentation In lmPipeRun.Representations
959
            If oRep.Attributes("RepresentationType").Value = "Connector" And oRep.Attributes("ItemStatus").Value = "Active" Then
960
                Dim _conn As LMConnector = objPlacement.PIDDataSource.GetConnector(oRep.Id)
961

    
962
                Dim find1 As Boolean = False
963
                Dim find2 As Boolean = False
964

    
965
                If _conn.ConnectItem1SymbolID IsNot Nothing Then
966
                    If _conn.ConnectItem1SymbolID.ToString = SP_ID1 Or _conn.ConnectItem1SymbolID.ToString = SP_ID2 Then
967
                        find1 = True
968
                    End If
969
                End If
970

    
971
                If _conn.ConnectItem2SymbolID IsNot Nothing Then
972
                    If _conn.ConnectItem2SymbolID.ToString = SP_ID1 Or _conn.ConnectItem2SymbolID.ToString = SP_ID2 Then
973
                        find2 = True
974
                    End If
975
                End If
976

    
977
                If find1 And find2 Then
978
                    Return _conn
979
                End If
980
            End If
981
        Next
982

    
983
        If objConnector Is Nothing Then
984
            Debug.WriteLine("Error At GetLMConnectorBySP_ID")
985
        End If
986

    
987
        Return objConnector
988
    End Function
989

    
990
    Private Function CalcPointToPointdDistance(ByVal point1 As Pointd, ByVal point2 As Pointd) As Double
991
        Return Math.Pow(Math.Pow(point1.X - point2.X, 2) + Math.Pow(point1.Y - point2.Y, 2), 0.5)
992
    End Function
993

    
994
    Private Function IsCanDraw(ByVal itemGroup As ItemGroup) As Boolean
995
        Dim lineList As List(Of Line) = CDrawing.LINES
996

    
997
        Dim groupSymbols As List(Of Symbol) = New List(Of Symbol)
998
        Dim groupLines As List(Of Line) = New List(Of Line)
999

    
1000
        For Each item As Object In itemGroup.Group
1001
            If TypeOf (item) Is Line Then
1002
                groupLines.Add(item)
1003
            Else
1004
                groupSymbols.Add(item)
1005
            End If
1006
        Next
1007

    
1008
        For Each symbol As Symbol In groupSymbols
1009
            For Each conn As Connector In symbol.CONNECTORS
1010
                Dim _line As Line = FindLineByUID(CDrawing.LINES, conn.CONNECTEDITEM)
1011
                Dim _symbol As Symbol = FindSymbolByUID(CDrawing.SYMBOLS, conn.CONNECTEDITEM)
1012
                If _line IsNot Nothing Then
1013
                    If groupLines.Contains(_line) = False And String.IsNullOrEmpty(_line.LMCONNECTOR_MODELID) Then
1014
                        Return False
1015
                    End If
1016
                ElseIf _symbol IsNot Nothing Then
1017
                    If groupSymbols.Contains(_symbol) = False And _symbol.SPPID_ITEM_OBJECT Is Nothing Then
1018
                        Return False
1019
                    End If
1020
                End If
1021
            Next
1022
        Next
1023

    
1024
        For Each line As Line In groupLines
1025
            For Each conn As Connector In line.CONNECTORS
1026
                Dim _line As Line = FindLineByUID(CDrawing.LINES, conn.CONNECTEDITEM)
1027
                Dim _symbol As Symbol = FindSymbolByUID(CDrawing.SYMBOLS, conn.CONNECTEDITEM)
1028
                If _line IsNot Nothing Then
1029
                    If groupLines.Contains(_line) = False And String.IsNullOrEmpty(_line.LMCONNECTOR_MODELID) Then
1030
                        Return False
1031
                    End If
1032
                ElseIf _symbol IsNot Nothing Then
1033
                    If groupSymbols.Contains(_symbol) = False And _symbol.SPPID_ITEM_OBJECT Is Nothing Then
1034
                        Return False
1035
                    End If
1036
                End If
1037
            Next
1038
        Next
1039

    
1040

    
1041
        Return True
1042
    End Function
1043

    
1044
    Private Function IsContainGroup(ByVal UID As String, ByVal symbols As List(Of Symbol), ByVal lines As List(Of Line)) As Boolean
1045
        Dim line As Line = FindLineByUID(lines, UID)
1046
        Dim symbol As Symbol = FindSymbolByUID(symbols, UID)
1047

    
1048
        If line IsNot Nothing Then
1049
            Return True
1050
        ElseIf symbol IsNot Nothing Then
1051
            Return True
1052
        Else
1053
            Return False
1054
        End If
1055
    End Function
1056

    
1057
    Private Function GetGroupList() As List(Of ItemGroup)
1058
        Dim symbolList As List(Of Symbol) = CDrawing.SYMBOLS
1059
        Dim lineList As List(Of Line) = CDrawing.LINES
1060

    
1061
        Dim CGroupList As List(Of ItemGroup) = New List(Of ItemGroup)
1062

    
1063
        '' Line 기준으로 먼저 묶음
1064
        For Each line As Line In lineList
1065
            If line.GROUPING Then
1066
                Dim group As ItemGroup = GetGroupByLine(line)
1067
                CGroupList.Add(group)
1068
            End If
1069
        Next
1070

    
1071
        '' Symbol
1072
        For Each symbol As Symbol In symbolList
1073
            If symbol.GROUPING Then
1074
                Dim group As ItemGroup = New ItemGroup()
1075
                group.Add(symbol)
1076
                CGroupList.Add(group)
1077
            End If
1078
        Next
1079

    
1080
        Return CGroupList
1081
    End Function
1082

    
1083
    Private Function GetGroupByLine(ByVal line As Line) As ItemGroup
1084
        Dim CItemGroup As ItemGroup = New ItemGroup()
1085

    
1086
        Dim symbolList As List(Of Symbol) = CDrawing.SYMBOLS
1087
        Dim lineList As List(Of Line) = CDrawing.LINES
1088

    
1089
        Dim forwardItems As List(Of Object) = New List(Of Object)
1090
        Dim reverseItems As List(Of Object) = New List(Of Object)
1091
        line.GROUPING = False
1092

    
1093
        ''dd
1094
        Console.WriteLine(line.UID)
1095

    
1096
        Dim _symbol As Symbol = FindSymbolByUID(symbolList, line.CONNECTORS(0).CONNECTEDITEM)
1097
        Dim _line As Line = FindLineByUID(lineList, line.CONNECTORS(0).CONNECTEDITEM)
1098

    
1099
        If _line IsNot Nothing Then
1100
            If IsBranchLine(line.CONNECTORS(0).CONNECTEDITEM, line.UID, lineList) = False And _line.GROUPING And _line.SPPIDMAPPINGNAME = line.SPPIDMAPPINGNAME Then
1101
                _line.GROUPING = False
1102
                forwardItems.Add(_line)
1103
                FindConnectedItem(_line, forwardItems, line.SPPIDMAPPINGNAME)
1104
            End If
1105
        ElseIf _symbol IsNot Nothing Then
1106
            If _symbol.GROUPING Then
1107
                If _symbol.CONNECTORS.Count <= 2 Then
1108
                    _symbol.GROUPING = False
1109
                    forwardItems.Add(_symbol)
1110
                    FindConnectedItem(_symbol, forwardItems, line.SPPIDMAPPINGNAME)
1111
                Else
1112
                    Dim connector As List(Of Connector) = _symbol.CONNECTORS
1113
                    For index = 0 To connector.Count - 1
1114
                        If index < 2 Then
1115
                            If connector(index).CONNECTEDITEM = line.UID Then
1116
                                _symbol.GROUPING = False
1117
                                forwardItems.Add(_symbol)
1118
                                FindConnectedItem(_symbol, forwardItems, line.SPPIDMAPPINGNAME)
1119
                                Exit For
1120
                            End If
1121
                        End If
1122
                    Next
1123
                End If
1124
            End If
1125
        End If
1126

    
1127
        _symbol = FindSymbolByUID(symbolList, line.CONNECTORS(1).CONNECTEDITEM)
1128
        _line = FindLineByUID(lineList, line.CONNECTORS(1).CONNECTEDITEM)
1129
        If _line IsNot Nothing Then
1130
            If IsBranchLine(line.CONNECTORS(1).CONNECTEDITEM, line.UID, lineList) = False And _line.GROUPING And _line.SPPIDMAPPINGNAME = line.SPPIDMAPPINGNAME Then
1131
                _line.GROUPING = False
1132
                reverseItems.Add(_line)
1133
                FindConnectedItem(_line, reverseItems, line.SPPIDMAPPINGNAME)
1134
            End If
1135
        ElseIf _symbol IsNot Nothing Then
1136
            If _symbol.GROUPING Then
1137
                If _symbol.CONNECTORS.Count <= 2 Then
1138
                    _symbol.GROUPING = False
1139
                    reverseItems.Add(_symbol)
1140
                    FindConnectedItem(_symbol, reverseItems, line.SPPIDMAPPINGNAME)
1141
                Else
1142
                    Dim connector As List(Of Connector) = _symbol.CONNECTORS
1143
                    For index = 0 To connector.Count - 1
1144
                        If index < 2 Then
1145
                            If connector(index).CONNECTEDITEM = line.UID Then
1146
                                _symbol.GROUPING = False
1147
                                reverseItems.Add(_symbol)
1148
                                FindConnectedItem(_symbol, reverseItems, line.SPPIDMAPPINGNAME)
1149
                                Exit For
1150
                            End If
1151
                        End If
1152
                    Next
1153
                End If
1154
            End If
1155
        End If
1156

    
1157
        reverseItems.Reverse()
1158
        reverseItems.Add(line)
1159
        reverseItems.AddRange(forwardItems)
1160

    
1161
        For Each item As Object In reverseItems
1162
            CItemGroup.Add(item)
1163
        Next
1164

    
1165
        Return CItemGroup
1166
    End Function
1167

    
1168
    Private Sub FindConnectedItem(ByVal shape As Object, ByRef groupItem As List(Of Object), ByVal PIDMAPPINGNAME As String)
1169
        Dim symbolList As List(Of Symbol) = CDrawing.SYMBOLS
1170
        Dim lineList As List(Of Line) = CDrawing.LINES
1171

    
1172
        If TypeOf (shape) Is Line Then
1173
            Dim _line As Line = shape
1174

    
1175
            For Each conn As Connector In _line.CONNECTORS
1176
                Dim symbol As Symbol = FindSymbolByUID(symbolList, conn.CONNECTEDITEM)
1177
                Dim line As Line = FindLineByUID(lineList, conn.CONNECTEDITEM)
1178

    
1179
                If line IsNot Nothing Then
1180
                    If IsBranchLine(line.UID, _line.UID, lineList) = False And line.GROUPING And _line.SPPIDMAPPINGNAME = line.SPPIDMAPPINGNAME Then
1181
                        line.GROUPING = False
1182
                        groupItem.Add(line)
1183
                        FindConnectedItem(line, groupItem, PIDMAPPINGNAME)
1184
                    End If
1185
                ElseIf symbol IsNot Nothing Then
1186
                    If symbol.GROUPING Then
1187
                        If symbol.CONNECTORS.Count <= 2 Then
1188
                            symbol.GROUPING = False
1189
                            groupItem.Add(symbol)
1190
                            FindConnectedItem(symbol, groupItem, PIDMAPPINGNAME)
1191
                        Else
1192
                            Dim connector As List(Of Connector) = symbol.CONNECTORS
1193
                            For index = 0 To connector.Count - 1
1194
                                If index < 2 Then
1195
                                    If connector(index).CONNECTEDITEM = _line.UID Then
1196
                                        symbol.GROUPING = False
1197
                                        groupItem.Add(symbol)
1198
                                        FindConnectedItem(symbol, groupItem, PIDMAPPINGNAME)
1199
                                        Exit For
1200
                                    End If
1201
                                End If
1202
                            Next
1203
                        End If
1204
                    End If
1205
                End If
1206
            Next
1207

    
1208
        ElseIf TypeOf (shape) Is Symbol Then
1209
            Dim _symbol As Symbol = shape
1210

    
1211
            For Each conn As Connector In _symbol.CONNECTORS
1212
                Dim symbol As Symbol = FindSymbolByUID(symbolList, conn.CONNECTEDITEM)
1213
                Dim line As Line = FindLineByUID(lineList, conn.CONNECTEDITEM)
1214

    
1215
                If line IsNot Nothing Then
1216
                    If line.GROUPING And PIDMAPPINGNAME = line.SPPIDMAPPINGNAME Then
1217
                        line.GROUPING = False
1218
                        groupItem.Add(line)
1219
                        FindConnectedItem(line, groupItem, PIDMAPPINGNAME)
1220
                        Exit For
1221
                    End If
1222
                ElseIf symbol IsNot Nothing Then
1223
                    If symbol.GROUPING Then
1224
                        If symbol.CONNECTORS.Count <= 2 Then
1225
                            symbol.GROUPING = False
1226
                            groupItem.Add(symbol)
1227
                            FindConnectedItem(symbol, groupItem, PIDMAPPINGNAME)
1228
                        Else
1229
                            Dim connector As List(Of Connector) = symbol.CONNECTORS
1230
                            For index = 0 To connector.Count - 1
1231
                                If index < 2 Then
1232
                                    If connector(index).CONNECTEDITEM = _symbol.UID Then
1233
                                        symbol.GROUPING = False
1234
                                        groupItem.Add(symbol)
1235
                                        FindConnectedItem(symbol, groupItem, PIDMAPPINGNAME)
1236
                                        Exit For
1237
                                    End If
1238
                                End If
1239
                            Next
1240
                        End If
1241
                    End If
1242
                End If
1243
            Next
1244
        End If
1245
    End Sub
1246

    
1247

    
1248
    Private Function IsBranchLine(ByVal connectedUID As String, ByVal UID As String, ByVal lines As List(Of Line)) As Boolean
1249
        Dim connLine = FindLineByUID(lines, connectedUID)
1250
        If connLine IsNot Nothing Then
1251
            If connLine.CONNECTORS(0).CONNECTEDITEM <> UID And connLine.CONNECTORS(1).CONNECTEDITEM <> UID Then
1252
                Return True
1253
            End If
1254
        End If
1255

    
1256
        Return False
1257
    End Function
1258

    
1259

    
1260
    Private Function FindLineByUID(ByVal lines As List(Of Line), ByVal uid As String) As Line
1261
        For Each line As Line In lines
1262
            If line.UID = uid Then
1263
                Return line
1264
            End If
1265
        Next
1266

    
1267
        Return Nothing
1268
    End Function
1269

    
1270

    
1271
    Private Function FindSymbolByUID(ByVal symbols As List(Of Symbol), ByVal uid As String) As Symbol
1272
        For Each symbol As Symbol In symbols
1273
            If symbol.UID = uid Then
1274
                Return symbol
1275
            End If
1276
        Next
1277

    
1278
        Return Nothing
1279
    End Function
1280

    
1281
    Public Class ItemGroup
1282
        Private _group As List(Of Object) = New List(Of Object)
1283

    
1284
        Public Property Group As List(Of Object)
1285
            Get
1286
                Return _group
1287
            End Get
1288
            Set(value As List(Of Object))
1289
                _group = value
1290
            End Set
1291
        End Property
1292

    
1293
        Public Sub Add(ByVal item As Object)
1294
            group.Add(item)
1295
        End Sub
1296
    End Class
1297

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