프로젝트

일반

사용자정보

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

markus / MarkupToPDF / Controls / Line / ArcControl.cs @ 0d00f9c8

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

1
using System;
2
using System.Net;
3
using System.Windows;
4
using System.Windows.Controls;
5
using System.Windows.Documents;
6
using System.Windows.Ink;
7
using System.Windows.Input;
8
using System.Windows.Media;
9
using System.Windows.Media.Animation;
10
using System.Windows.Shapes;
11
using System.ComponentModel;
12
using System.Collections.Generic;
13
using MarkupToPDF.Controls.Common;
14
using MarkupToPDF.Common;
15
using MarkupToPDF.Serialize.S_Control;
16
using MarkupToPDF.Serialize.Core;
17
using System.Linq;
18

    
19
namespace MarkupToPDF.Controls.Line
20
{
21

    
22
    public class ArcControl : CommentUserInfo, IDisposable, INotifyPropertyChanged, IMarkupCommonData, IDashControl
23
    {
24
        #region 초기선언
25
        public event PropertyChangedEventHandler PropertyChanged;
26
        private const string PART_ArcPath = "PART_ArcPath";
27
        public Path Base_ArcPath = null;
28
        #endregion
29
        static ArcControl()
30
        {
31
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ArcControl), new FrameworkPropertyMetadata(typeof(ArcControl)));
32
            //Application.Current.Resources.MergedDictionaries.Add(Application.LoadComponent(new Uri("/MarkupToPDF;Component/Themes/generic.xaml")) as ResourceDictionary);
33
            ResourceDictionary dictionary = new ResourceDictionary();
34
            dictionary.Source = new Uri("/MarkupToPDF;component/themes/generic.xaml", UriKind.RelativeOrAbsolute);
35
            Application.Current.Resources.MergedDictionaries.Add(dictionary);
36
             //System.Diagnostics.Debug.WriteLine("resource Count :" + Application.Current.Resources.MergedDictionaries.Count);
37
        }
38

    
39
        public ArcControl()
40
        {
41
            this.DefaultStyleKey = typeof(ArcControl);
42
        }
43

    
44
        public void Dispose()
45
        {
46
            GC.Collect();
47
            GC.SuppressFinalize(this);
48
            Control control = new Control();
49
        }
50
        protected void OnPropertyChanged(string propName)
51
        {
52
            if (PropertyChanged != null)
53
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
54
        }
55

    
56
        #region Dependency Properties
57

    
58
        
59

    
60
        public static readonly DependencyProperty IsSelectedProperty =
61
    DependencyProperty.Register("IsSelected", typeof(bool), typeof(ArcControl), new FrameworkPropertyMetadata(false, IsSelectedChanged));
62

    
63
        public static readonly DependencyProperty ControlTypeProperty =
64
    DependencyProperty.Register("ControlType", typeof(ControlType), typeof(ArcControl), new FrameworkPropertyMetadata(ControlType.ArcLine));
65

    
66
        public static readonly DependencyProperty OverViewPathDataProperty = DependencyProperty.Register(
67
                "OverViewPathData", typeof(Geometry), typeof(ArcControl), new PropertyMetadata(null));
68

    
69
        public static readonly DependencyProperty UserIDProperty = DependencyProperty.Register(
70
                "UserID", typeof(string), typeof(ArcControl), new PropertyMetadata(null));
71
        public static readonly DependencyProperty LineSizeProperty = DependencyProperty.Register(
72
              "LineSize", typeof(double), typeof(ArcControl), new PropertyMetadata((Double)3));
73

    
74
//강인구 추가
75
        public static readonly DependencyProperty DashSizeProperty = DependencyProperty.Register(
76
              "DashSize", typeof(DoubleCollection), typeof(ArcControl), new PropertyMetadata(new DoubleCollection { 99999999 }, PointValueChanged));
77

    
78
        public static readonly DependencyProperty StrokeColorProperty = DependencyProperty.Register(
79
               "StrokeColor", typeof(SolidColorBrush), typeof(ArcControl), new PropertyMetadata(new SolidColorBrush(Colors.Red)));
80

    
81
        public static readonly DependencyProperty PathDataProperty = DependencyProperty.Register(
82
              "PathData", typeof(Geometry), typeof(ArcControl), null);
83

    
84
        //public static readonly DependencyProperty ClockProperty = DependencyProperty.Register(
85
        //       "Clock", typeof(SweepDirection), typeof(ArcControl), new PropertyMetadata(SweepDirection.Clockwise));
86
        public static readonly DependencyProperty ClockProperty = DependencyProperty.Register(
87
               "Clock", typeof(bool), typeof(ArcControl), new PropertyMetadata(false));
88

    
89
        public static readonly DependencyProperty StartPointProperty = DependencyProperty.Register(
90
               "StartPoint", typeof(Point), typeof(ArcControl), new PropertyMetadata(new Point(0, 0), PointValueChanged));
91
        public static readonly DependencyProperty MidPointProperty = DependencyProperty.Register(
92
               "MidPoint", typeof(Point), typeof(ArcControl), new PropertyMetadata(new Point(0, 0), PointValueChanged));
93

    
94
        public static readonly DependencyProperty EndPointProperty = DependencyProperty.Register(
95
               "EndPoint", typeof(Point), typeof(ArcControl), new PropertyMetadata(new Point(0, 0), PointValueChanged));
96
        
97
        public static readonly DependencyProperty PointSetProperty = DependencyProperty.Register(
98
                "PointSet", typeof(List<Point>), typeof(ArcControl), new PropertyMetadata(new List<Point>(), PointValueChanged));
99

    
100
        public static readonly DependencyProperty isTransOnProperty = DependencyProperty.Register(
101
                "isTransOn", typeof(bool), typeof(ArcControl), new PropertyMetadata(false));
102

    
103
        public static readonly DependencyProperty AngleProperty =
104
            DependencyProperty.Register("AngleValue", typeof(double), typeof(ArcControl), new PropertyMetadata((double)0.0, new PropertyChangedCallback
105
                (AngleValueChanged)));
106

    
107
        public static readonly DependencyProperty CenterXProperty =
108
            DependencyProperty.Register("CenterX", typeof(double), typeof(ArcControl), new PropertyMetadata((double)0, OnCenterXYChanged));
109

    
110
        public static readonly DependencyProperty CenterYProperty =
111
            DependencyProperty.Register("CenterY", typeof(double), typeof(ArcControl), new PropertyMetadata((double)0, OnCenterXYChanged));
112
        #endregion
113
        #region PropertyChanged Method
114
        
115
        public static void IsSelectedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
116
        {
117
            //var instance = (ArcControl)sender;
118

    
119
            //if (e.OldValue != e.NewValue && instance.Base_ArcPath != null)
120
            //{
121

    
122
            //    instance.SetValue(e.Property, e.NewValue);
123

    
124
            //    if (instance.IsSelected)
125
            //    {
126
            //        instance.Base_ArcPath.Stroke = new SolidColorBrush(Colors.Blue);
127
            //    }
128
            //    else
129
            //    {
130
            //        instance.Base_ArcPath.Stroke = new SolidColorBrush(Colors.Red);
131
            //    }
132
            //}
133
        }
134

    
135

    
136
        public static void PointValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
137
        {
138
            var instance = (ArcControl)sender;
139
            if (e.OldValue != e.NewValue && instance.Base_ArcPath != null)
140
            {
141
                instance.SetValue(e.Property, e.NewValue);
142
                instance.SetArcPath();
143
            }
144
        }
145
        public static void AngleValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
146
        {
147
            var instance = (ArcControl)sender;
148
            if (e.OldValue != e.NewValue && instance.Base_ArcPath != null)
149
            {
150
                instance.SetValue(e.Property, e.NewValue);
151
                instance.SetArcPath();
152
            }
153
        }
154
        public static void OnCenterXYChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
155
        {
156
            var instance = (ArcControl)sender;
157
            if (e.OldValue != e.NewValue && instance.Base_ArcPath != null)
158
            {
159
                instance.SetValue(e.Property, e.NewValue);
160
                instance.SetArcPath();
161
            }
162
        }
163

    
164
      
165

    
166
        #endregion
167
        #region Properties
168
        public string UserID
169
        {
170
            get { return (string)GetValue(UserIDProperty); }
171
            set
172
            {
173
                if (this.UserID != value)
174
                {
175
                    SetValue(UserIDProperty, value);
176
                    OnPropertyChanged("UserID");
177
                }
178
            }
179
        }
180
        public Double LineSize
181
        {
182
            get { return (Double)GetValue(LineSizeProperty); }
183
            set
184
            {
185
                if (this.LineSize != value)
186
                {
187
                    SetValue(LineSizeProperty, value);
188
                }
189
            }
190
        }
191

    
192

    
193
        public bool Clock
194
        {
195
            get { return (bool)GetValue(ClockProperty); }
196
            set
197
            {
198
                if (this.Clock != value)
199
                {
200
                    SetValue(ClockProperty, value);
201
                    OnPropertyChanged("Clock");
202
                }
203
            }
204
        }
205

    
206
        //public SweepDirection Clock
207
        //{
208
        //    get { return (SweepDirection)GetValue(ClockProperty); }
209
        //    set
210
        //    {
211
        //        if (this.Clock != value)
212
        //        {
213
        //            SetValue(ClockProperty, value);
214
        //            OnPropertyChanged("Clock");
215
        //        }
216
        //    }
217
        //}
218
        public DoubleCollection DashSize
219
        {
220
            get { return (DoubleCollection)GetValue(DashSizeProperty); }
221
            set
222
            {
223
                if (this.DashSize != value)
224
                {
225
                    SetValue(DashSizeProperty, value);
226
                }
227
            }
228
        }
229
        public List<Point> PointSet
230
        {
231
            get { return (List<Point>)GetValue(PointSetProperty); }
232
            set { SetValue(PointSetProperty, value); }
233
        }
234
        public double CenterX
235
        {
236
            get { return (double)GetValue(CenterXProperty); }
237
            set { SetValue(CenterXProperty, value); }
238
        }
239
        public double CenterY
240
        {
241
            get { return (double)GetValue(CenterYProperty); }
242
            set { SetValue(CenterYProperty, value); }
243
        }
244
        public override SolidColorBrush StrokeColor
245
        {
246
            get { return (SolidColorBrush)GetValue(StrokeColorProperty); }
247
            set
248
            {
249
                if (this.StrokeColor != value)
250
                {
251
                    SetValue(StrokeColorProperty, value);
252
                }
253
            }
254
        }
255

    
256
        public Geometry OverViewPathData
257
        {
258
            get
259
            {
260
                return (Geometry)GetValue(OverViewPathDataProperty);
261
            }
262
            set
263
            {
264
                SetValue(OverViewPathDataProperty, value);
265
                OnPropertyChanged("OverViewPathData");
266
            }
267
        }
268

    
269
        public Geometry PathData
270
        {
271
            get { return (Geometry)GetValue(PathDataProperty); }
272
            set
273
            {
274
                SetValue(PathDataProperty, value);
275
                OnPropertyChanged("PathData");
276
            }
277
        }
278
        public override bool IsSelected
279
        {
280
            get
281
            {
282
                return (bool)GetValue(IsSelectedProperty);
283
            }
284
            set
285
            {
286
                SetValue(IsSelectedProperty, value);
287
            }
288
        }
289

    
290
        public override ControlType ControlType
291
        {
292
            get
293
            {
294
                return (ControlType)GetValue(ControlTypeProperty);
295
            }
296
            set
297
            {
298
                SetValue(ControlTypeProperty, value);
299
                OnPropertyChanged("ControlType");
300
            }
301
        }
302
        public double AngleValue
303
        {
304
            get { return (double)GetValue(AngleProperty); }
305
            set { SetValue(AngleProperty, value); }
306
        }
307
        public double Angle
308
        {
309
            get { return (double)GetValue(AngleProperty); }
310
            set
311
            {
312
                if (this.Angle != value)
313
                {
314
                    SetValue(AngleProperty, value);
315
                }
316
            }
317
        }
318
        public Point EndPoint
319
        {
320
            get { return (Point)GetValue(EndPointProperty); }
321
            set
322
            {
323
                SetValue(EndPointProperty, value);
324
                OnPropertyChanged("EndPoint");
325
            }
326
        }
327
        public Point StartPoint
328
        {
329
            get { return (Point)GetValue(StartPointProperty); }
330
            set
331
            {
332
                SetValue(StartPointProperty, value);
333
                OnPropertyChanged("StartPoint");
334
            }
335
        }
336
        public Point MidPoint
337
        {
338
            get { return (Point)GetValue(MidPointProperty); }
339
            set
340
            {
341
                SetValue(MidPointProperty, value);
342
                OnPropertyChanged("MidPoint");
343
            }
344
        }
345
        public bool isTransOn
346
        {
347
            get { return (bool)GetValue(isTransOnProperty); }
348
            set
349
            {
350
                SetValue(isTransOnProperty, value);
351
                OnPropertyChanged("isTransOn");
352
            }
353
        }
354

    
355
        #endregion
356
        #region Object & Variable
357
        PathGeometry pathGeometry = new PathGeometry();
358
        GeometryGroup instanceGroup = new GeometryGroup();
359
        #endregion
360
        public override void OnApplyTemplate()
361
        {
362
            base.OnApplyTemplate();
363
            Base_ArcPath = GetTemplateChild(PART_ArcPath) as Path;
364
            SetArcPath();
365
        }
366

    
367
        public override void UpdateControl()
368
        {
369
            this.StartPoint = new Point(this.PointSet[0].X, this.PointSet[0].Y);
370
            this.MidPoint = new Point(this.PointSet[1].X, this.PointSet[1].Y);
371
            this.EndPoint = new Point(this.PointSet[2].X, this.PointSet[2].Y);
372
        }
373

    
374
        public void setClock()
375
        {
376
            if (Clock)
377
            {
378
                this.Clock = false;
379
            }
380
            else
381
            {
382
                this.Clock = true;
383
            }
384
        }
385

    
386
        //public void setClock()
387
        //{
388
        //    if(this.Clock == SweepDirection.Clockwise)
389
        //    {
390
        //        this.Clock = SweepDirection.Counterclockwise;
391
        //    }
392
        //    else
393
        //    {
394
        //        this.Clock =SweepDirection.Clockwise;
395
        //    }
396
        //}
397
        private void SetArcPath()
398
        {
399
            this.ApplyTemplate();
400

    
401

    
402
            //강인구 추가
403
            Base_ArcPath.StrokeDashArray.Clear();
404
            foreach (var item in this.DashSize)
405
            {
406
                Base_ArcPath.StrokeDashArray.Add(item);
407
            }
408
            instanceGroup.Children.Clear();
409

    
410

    
411
            PathFigure pathFigure = new PathFigure();
412

    
413
            pathFigure.StartPoint = this.StartPoint;
414
            QuadraticBezierSegment qb = new QuadraticBezierSegment();
415

    
416

    
417
          
418

    
419

    
420
            
421
            
422

    
423

    
424
            if (MidPoint != null)
425
            {
426
                if (MidPoint == new Point(0,0))
427
                {
428
                    double xSharp = 0;
429
                    double ySharp = 0;
430

    
431
                    //Point t_start = new Point(0, 0);
432
                    //Point t_end = new Point(30, 10);
433

    
434
                    var midP = MathSet.getMiddlePoint(StartPoint, EndPoint);
435
                    Point normalV = MathSet.GetNormVectorBetween(StartPoint, EndPoint);
436
                    var dis = MathSet.DistanceTo(StartPoint, EndPoint);
437

    
438
                    if (!this.Clock)
439
                    {
440
                        xSharp = -normalV.Y;
441
                        ySharp = normalV.X;
442
                    }
443
                    else
444
                    {
445
                        xSharp = normalV.Y;
446
                        ySharp = -normalV.X;
447
                    }
448

    
449
                    var pointN = new Point(xSharp * dis, ySharp * dis);
450
                    MidPoint = new Point(pointN.X + midP.X, pointN.Y + midP.Y);
451
                }
452
                ////System.Diagnostics.Debug.WriteLine(this.MidPoint.ToString());
453
                //qb.Point1 = new Point(200, 200);
454
                //qb.Point1 = this.MidPoint;
455
                qb.Point1 = this.MidPoint;
456
            }
457

    
458
            qb.Point2 = this.EndPoint;
459
            pathFigure.Segments.Add(qb);
460
            pathGeometry.Figures = new PathFigureCollection();
461
            pathGeometry.Figures.Add(pathFigure);
462
            pathFigure.IsFilled = false;
463
            pathFigure.IsClosed = false;
464
            instanceGroup.Children.Add(pathGeometry);
465

    
466
            //Arc Arrow
467
            //if(ControlType == ControlType.ArcArrow)
468
            if (isTransOn)
469
            {
470
                //isTransOn = true;
471
                instanceGroup.Children.Add(DrawSet.DrawArrow(this.MidPoint, this.StartPoint, this.LineSize));
472
                instanceGroup.Children.Add(DrawSet.DrawArrow(this.EndPoint, this.MidPoint, this.LineSize));
473
                this.Base_ArcPath.Fill = this.StrokeColor;
474
            }
475
            //Base_ArcPath.StrokeThickness = 3;
476

    
477
            instanceGroup.FillRule = FillRule.Nonzero;
478
            this.PathData = instanceGroup;
479
            this.OverViewPathData = PathData;
480

    
481
        }
482

    
483
        public static PathGeometry ConverseAllow(Point p2, Point p1, double lineSize)
484
        {
485
            double theta = Math.Atan2((p2.Y - p1.Y), (p2.X - p1.X)) * 180 / Math.PI;
486
            PathGeometry pathGeometry2 = new PathGeometry();
487
            PathFigure pathFigure2 = new PathFigure();
488
            pathFigure2.StartPoint = p2;
489

    
490
            Point lpoint2 = new Point(p2.X + lineSize * 2, p2.Y + lineSize * 4);
491
            Point rpoint2 = new Point(p2.X - lineSize * 2, p2.Y + lineSize * 4);
492
            LineSegment seg1_1 = new LineSegment();
493
            seg1_1.Point = lpoint2;
494
            pathFigure2.Segments.Add(seg1_1);
495

    
496
            LineSegment seg2_1 = new LineSegment();
497
            seg2_1.Point = rpoint2;
498
            pathFigure2.Segments.Add(seg2_1);
499

    
500
            LineSegment seg3_1 = new LineSegment();
501
            seg3_1.Point = p2;
502
            pathFigure2.Segments.Add(seg3_1);
503

    
504
            LineSegment seg4_1 = new LineSegment();
505

    
506
            seg4_1.Point = new Point(lpoint2.X, lpoint2.Y);
507
            pathFigure2.Segments.Add(seg4_1);
508

    
509
            //pathFigure2.IsFilled = true;
510
            //pathFigure2.IsClosed = true;
511

    
512
            RotateTransform transform2 = new RotateTransform();
513
            transform2.Angle = theta + 90;
514
            transform2.CenterX = p2.X;
515
            transform2.CenterY = p2.Y;
516
            pathGeometry2.Figures.Add(pathFigure2);
517
            pathGeometry2.Transform = transform2;
518
            return pathGeometry2;
519
        }
520

    
521
        public override void ApplyOverViewData()
522
        {
523
            this.OverViewPathData = this.PathData;
524
        }
525

    
526
        /// <summary>
527
        /// call when mouse is moving while drawing control
528
        /// </summary>
529
        /// <author>humkyung</author>
530
        /// <param name="pt"></param>
531
        /// <param name="bAxisLocked"></param>
532
        public override void OnCreatingMouseMove(Point pt, bool bAxisLocked, bool bShiftKeyPressed)
533
        {
534
            this.isTransOn = false;
535
            this.EndPoint = pt;
536
            this.MidPoint = new Point(0, 0);
537

    
538
            if (bAxisLocked || bShiftKeyPressed)
539
            {
540
                Point tmp = this.EndPoint;
541
                string angle = MathSet.returnAngleString(this.StartPoint, ref tmp, true);
542
                this.EndPoint = tmp;
543
            }
544

    
545
            this.PointSet = new List<Point>
546
            {
547
                this.StartPoint,
548
                this.MidPoint,
549
                this.EndPoint,
550
            };
551
        }
552

    
553
        /// <summary>
554
        /// move control point has same location of given pt along given delta
555
        /// </summary>
556
        /// <author>humkyung</author>
557
        /// <date>2019.06.20</date>
558
        /// <param name="pt"></param>
559
        /// <param name="dx"></param>
560
        /// <param name="dy"></param>
561
        public override void OnMoveCtrlPoint(Point pt, double dx, double dy)
562
        {
563
            Point selected = MathSet.getNearPoint((this as IPath).PointSet, pt);
564
            selected.X += dx;
565
            selected.Y += dy;
566
            for (int i = 0; i < (this as IPath).PointSet.Count; i++)
567
            {
568
                if (pt.Equals((this as IPath).PointSet[i]))
569
                {
570
                    (this as IPath).PointSet[i] = selected;
571
                }
572
            }
573
            this.UpdateControl();
574
        }
575

    
576
        /// <summary>
577
        /// return Arc's area
578
        /// </summary>
579
        /// <author>humkyung</author>
580
        /// <date>2019.06.13</date>
581
        public override Rect ItemRect
582
        {
583
            get
584
            {
585
                double dMinX = Math.Min(this.StartPoint.X, this.EndPoint.X);
586
                dMinX = Math.Min(this.MidPoint.X, dMinX);
587
                double dMinY = Math.Min(this.StartPoint.Y, this.EndPoint.Y);
588
                dMinY = Math.Min(this.MidPoint.Y, dMinY);
589
                double dMaxX = Math.Max(this.StartPoint.X, this.EndPoint.X);
590
                dMaxX = Math.Max(this.MidPoint.X, dMaxX);
591
                double dMaxY = Math.Max(this.StartPoint.Y, this.EndPoint.Y);
592
                dMaxY = Math.Max(this.MidPoint.Y, dMaxY);
593

    
594
                return new Rect(new Point(dMinX, dMinY), new Point(dMaxX, dMaxY));
595
            }
596
        }
597

    
598
        /// <summary>
599
        /// Serialize this
600
        /// </summary>
601
        /// <param name="sUserId"></param>
602
        /// <returns></returns>
603
        public override string Serialize()
604
        {
605
            using (S_ArcControl STemp = new S_ArcControl())
606
            {
607
                STemp.TransformPoint = "0|0";
608
                STemp.PointSet = this.PointSet;
609
                STemp.SizeSet = String.Format("{0}", this.LineSize);
610
                //STemp.StrokeColor = "#FF000FFF";
611
                STemp.StrokeColor = this.StrokeColor.Color.ToString();
612
                STemp.StartPoint = this.StartPoint;
613
                STemp.UserID = this.UserID;
614
                STemp.Opac = this.Opacity;
615
                STemp.MidPoint = this.MidPoint;
616
                STemp.EndPoint = this.EndPoint;
617
                STemp.IsTransOn = this.isTransOn;
618
                STemp.DashSize = this.DashSize;
619
                STemp.Clock = this.Clock;
620
                //STemp.ArcStyleSet = instance.ControlType;
621
                STemp.Name = this.GetType().Name.ToString();
622

    
623
                ///강인구 추가(2017.11.02)
624
                ///Memo 추가
625
                STemp.Memo = this.Memo;
626

    
627
                return "|DZ|" + JsonSerializerHelper.CompressString((STemp.JsonSerialize()));
628
            }
629
        }
630

    
631
        /// <summary>
632
        /// create a arccontrol from given string
633
        /// </summary>
634
        /// <param name="str"></param>
635
        /// <returns></returns>
636
        public static ArcControl FromString(string str, SolidColorBrush brush, string sProjectNo)
637
        {
638
            ArcControl instance = null;
639
            using (S_ArcControl s = JsonSerializerHelper.JsonDeserialize<S_ArcControl>(str))
640
            {
641
                string[] data2 = s.SizeSet.Split(delimiterChars2, StringSplitOptions.RemoveEmptyEntries);
642
                instance = new ArcControl()
643
                {
644
                    StartPoint = s.StartPoint,
645
                    EndPoint = s.EndPoint,
646
                    DashSize = s.DashSize,
647
                    PointSet = s.PointSet,
648
                    isTransOn = s.IsTransOn,
649
                    MidPoint = s.MidPoint,
650
                    StrokeColor = brush,
651
                    Opacity = s.Opac,
652
                    Clock = s.Clock,
653
                    LineSize = Convert.ToDouble(data2.First()),
654
                    UserID = s.UserID,
655
                    Memo = s.Memo
656
                };
657
            }
658

    
659
            return instance;
660
        }
661
    }
662
}
클립보드 이미지 추가 (최대 크기: 500 MB)