2012년 12월 9일 일요일

[아이디어] 캐드 테이블 객체 적용

필드(Field)객체는 문자열 뿐만아니라 테이블(Table) 객체의 셀(Cell)정보에 추가될 수 있습니다.
따라서 테이블 객체의 기능을 확장할 수 있습니다.

그것은 테이블의 내용을 웹 서비스와 연결이 가능합니다. 예를 들면 구글의 드라이브 또는 M/S사의 SkyDrive - 엑셀문서 와의 연동이 가능합니다.

캐드도면에서 테이블 객체가 수정되면 관련 웹문서에 적용시켜주고, 반대로 웹문서가 수정되면 캐드에서의 문서가 변경이 됩니다.

[주요특징]

1. CAD 테이블 정보를 구글 DOCS의 엑셀문서에 반영

2. 구글 DOCS의 엑셀문서를 캐드 테이블에 반영

[기능개선]

테이블에 필드를 추가할 때 iDwgField상의 라이브러리를 선택할 수 있는 기능이 필요함

(arx모듈에서 추가해야하는데,... 쉽지않겠군요)


<아이디어 개념도>

2012년 12월 5일 수요일

[코드] Kaxaml 테스트


using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.Windows;

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Markup;
using System.Xml;
using System.IO;

using iDwgFieldMgd;

using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;

public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;
    private Window  wintest;

    public string Regen(string hField, string hFrom, string hTo)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;

            long ln1 = Convert.ToInt64(hField, 16);
            Handle hn1 = new Handle(ln1);
            _idField = db.GetObjectId(false, hn1, 0);

            long ln2 = Convert.ToInt64(hFrom, 16);
            if (ln2 > 0)
            {
                Handle hn2 = new Handle(ln2);
                _idFrom = db.GetObjectId(false, hn2, 0);
            }

            long ln3 = Convert.ToInt64(hTo, 16);
            if (ln3 > 0)
            {
                Handle hn3 = new Handle(ln3);
                _idTo = db.GetObjectId(false, hn3, 0);
            }
        }
        catch (Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }

        return "로딩됨";
    }

    public string Open(string hField, string hFrom, string hTo)
    {
        try {
            //[XAML코드]Kaxaml 테스트 포스트 아이디
            String codes = iDwgUtils.GetXamlCode("1658519126633352894");

            StringReader sr = new StringReader(codes);

            XmlReader reader = XmlReader.Create(sr);

            wintest = (Window)XamlReader.Load(reader);
            wintest.Title = "Kaxaml";
            wintest.Show();

            wintest.SizeChanged += wintest_Changed;
        }
        catch(System.Exception ex)
        {
             MessageBox.Show(ex.Message);
        }
        return Regen(hField, hFrom, hTo);
    }

    private void wintest_Changed(object sender, RoutedEventArgs e)
    {
    //    MessageBox.Show("Dynamic windows loaded from XAML string");
    }

    public bool Exit(string str)
    {
           wintest.Close();
           return true;
    }
}

[XAML 코드] Kaxml 로고
























































Click on the label to make it rotate.



2012년 12월 4일 화요일

[코드]XAML실행테스트

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.Windows;

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Markup;
using System.Xml;
using System.IO;

using iDwgFieldMgd;

using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;

public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;
    private Window wintest;

    public string Regen(string hField, string hFrom, string hTo)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;

            long ln1 = Convert.ToInt64(hField, 16);
            Handle hn1 = new Handle(ln1);
            _idField = db.GetObjectId(false, hn1, 0);

            long ln2 = Convert.ToInt64(hFrom, 16);
            if (ln2 > 0)
            {
                Handle hn2 = new Handle(ln2);
                _idFrom = db.GetObjectId(false, hn2, 0);
            }

            long ln3 = Convert.ToInt64(hTo, 16);
            if (ln3 > 0)
            {
                Handle hn3 = new Handle(ln3);
                _idTo = db.GetObjectId(false, hn3, 0);
            }
        }
        catch (Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }

        return "로딩됨";
    }

    public string Open(string hField, string hFrom, string hTo)
    {
        try {
            //[XAML코드]기본윈도우의 포스트 아이디
            String codes = iDwgUtils.GetXamlCode("7332555001323949436");

            StringReader sr = new StringReader(codes);

            XmlReader reader = XmlReader.Create(sr);

            Window wintest = (Window)XamlReader.Load(reader);

            wintest.Show();

            wintest.SizeChanged += wintest_Changed;
        }
        catch(System.Exception ex)
        {
             MessageBox.Show(ex.Message);
        }
        return Regen(hField, hFrom, hTo);
    }

    private void wintest_Changed(object sender, RoutedEventArgs e)
    {
    //    MessageBox.Show("Dynamic windows loaded from XAML string");
    }

    public void Exit(string str)
    {
           wintest.Close();
    }
}

[XAML코드]기본윈도우


































































































2012년 11월 27일 화요일

[코드] 타이머(for AutoCAD R/LT 2013) postID = "2109696018724171468"

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;

using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;

namespace TransientSelection_6AA3989FA391470D9923
{
    public class TransientTimer : Transient
    {
        private Point3d _pos3d = new Point3d();
        private TextStyle _style;

        public TransientTimer()
        {
            _style = new TextStyle();
            _style.Font = new FontDescriptor("Calibri", false, true, 0, 0);
            _style.TextSize = 10;
        }
     
        public void SetPosition(Point3d pos3d)
          {
               _pos3d = pos3d;
          }
     
        protected override int SubSetAttributes(DrawableTraits traits)
        {
            traits.FillType = FillType.FillAlways;
            return (int)DrawableAttributes.None;
        }

        protected override void SubViewportDraw(ViewportDraw vd)
        {
            DrawText(vd.Geometry, "ViewportDraw");
        }

        protected override bool SubWorldDraw(WorldDraw wd)
        {
            DrawText(wd.Geometry,DateTime.Now.ToString("HH:mm:ss tt"));
            return true;
        }

        private void DrawText(Geometry g, string text)
        {
            if (g != null)
            {
                g.PushOrientationTransform(OrientationBehavior.Screen);
                g.PushPositionTransform(PositionBehavior.Screen, new Point2d(20,20));
                g.Text(
                    new Point3d(0, 0, 0), //_pos3d,  // Position
                    new Vector3d(0, 0, 1), // Normal
                    new Vector3d(1, 0, 0), // Direction
                    text,                  // Text
                    true,                  // Rawness
                    _style                 // TextStyle
                );
                g.PopModelTransform();
                g.PopModelTransform();
            }
        }

        protected override void OnDeviceInput(DeviceInputEventArgs e)
        {
            base.OnDeviceInput(e);
        }

        protected override void OnPointInput(PointInputEventArgs e)
        {
            base.OnPointInput(e);
        }
    }
}

public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;
    private TransientSelection_6AA3989FA391470D9923.TransientTimer _tb = null;
    private Point3d _pos3d = new Point3d();

    public string Open(string hField, string hFrom, string hTo)
    {
        _tb = new TransientSelection_6AA3989FA391470D9923.TransientTimer();
        Transient.CapturedDrawable = _tb;
        TransientManager.CurrentTransientManager.AddTransient(_tb, TransientDrawingMode.Main, 128, new IntegerCollection() );
        WinApp.Idle += new System.EventHandler(OnIdle);
        return Regen(hField, hFrom, hTo);
    }

    public void OnIdle(object sender, System.EventArgs e)
    {
        _tb.SetPosition(_pos3d);
       TransientManager.CurrentTransientManager.UpdateTransient(_tb, new IntegerCollection());
    }

    public string Regen(string hField, string hFrom, string hTo)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;

            long ln1 = Convert.ToInt64(hFrom, 16);
            Handle hn1 = new Handle(ln1);
            _idFrom= db.GetObjectId(false, hn1, 0);

            using(Transaction tr = db.TransactionManager.StartTransaction())
            {
                DBObject txtObj = tr.GetObject(_idFrom, OpenMode.ForRead, false);
                if(txtObj !=null)
                {
                    if (txtObj.GetType() == typeof(MText))
                    {
                        _pos3d = ((MText)txtObj ).Location;
                    }
                    else
                    {
                        _pos3d = ((DBText)txtObj ).Position;
                    }
                }
            }
        }
        catch(Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }
        return "*";
    }

    public bool Exit(string msg)
    {
        WinApp.Idle -= new System.EventHandler(OnIdle);

        TransientManager.CurrentTransientManager.EraseTransient(_tb,
            new IntegerCollection());
        _tb.Dispose();
        _tb = null;

        return true;
    }

}

2012년 11월 26일 월요일

[코드]Field를 포함하는 문자개체의 위치를 출력 (postID = "7094591052476811047")


using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;

using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;

public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;

    public string Open(string hField, string hFrom, string hTo)
    {
        return Regen(hField, hFrom, hTo);
    }

    public string Regen(string hField, string hFrom, string hTo)
    {
        string evalStr ="123";
        Point3d position = new Point3d();
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;

            long ln1 = Convert.ToInt64(hFrom, 16);
            Handle hn1 = new Handle(ln1);
            _idFrom= db.GetObjectId(false, hn1, 0);

            using(Transaction tr = db.TransactionManager.StartTransaction())
            {
                DBObject txtObj = tr.GetObject(_idFrom, OpenMode.ForRead, false);
                if(txtObj !=null)
                {
                    if (txtObj.GetType() == typeof(MText))
                    {
                        position  = ((MText)txtObj ).Location;
                    }
                    else
                    {
                        position = ((DBText)txtObj ).Position;
                    }
                }
            }
        }
        catch(Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }
        return "(" + position.X + "," + position.Y + "," + position.Z + ")";
    }
}

2012년 11월 24일 토요일

[동영상]계산기 기능 테스트 동영상 (AutoCAD LT2010)

ARX 또는 Dotnet 프로그램을 로딩하지 않아도 c# 코드를 실행시켜줍니다.

<AutoCAD LT2010에서 테스트>

2012년 11월 23일 금요일

[동영상]FreezeDoorLayer 샘플소스 동영상 (AutoCAD LT2013)

[AutoCAD LT 2013에서 테스트]

[동영상]FreezeDoorLayer 샘플소스 동영상 (AutoCAD R2013)


[AutoCAD R2013 테스트]


[코드]FreezeDoorLayer 샘플소스(postID=8919245894159416811)

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.Interop;

using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;

public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;

    [CommandMethod("FreezeDoorLayer")]
    public static void FreezeDoorLayer()
    {
        Document acDoc = AcadApp.DocumentManager.MdiActiveDocument;
        Database acCurDb = acDoc.Database;
        // Start a transaction
        using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
        {
            LayerTable acLyrTbl;
            acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead) as LayerTable;
            foreach (ObjectId acObjId in acLyrTbl)
            {
                LayerTableRecord acLyrTblRec;
                acLyrTblRec = acTrans.GetObject(acObjId, OpenMode.ForRead) as LayerTableRecord;
                if (acLyrTblRec.Name.StartsWith("Door", StringComparison.OrdinalIgnoreCase) == true)
                {
                    if (acLyrTblRec.ObjectId != acCurDb.Clayer)
                    {
                        acLyrTblRec.UpgradeOpen();
                        acLyrTblRec.IsFrozen = true;
                    }
                }
            }
            // Commit the changes and dispose of the transaction
            acTrans.Commit();
        }
    }

    public string Open(string hField, string hFrom, string hTo)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;

            long ln1 = Convert.ToInt64(hField, 16);
            Handle hn1 = new Handle(ln1);
            _idField = db.GetObjectId(false, hn1, 0);

            long ln2 = Convert.ToInt64(hFrom, 16);
            if (ln2 > 0)
            {
                Handle hn2 = new Handle(ln2);
                _idFrom = db.GetObjectId(false, hn2, 0);
                RegisterEvent();
            }

            long ln3 = Convert.ToInt64(hTo, 16);
            if (ln3 > 0)
            {
                Handle hn3 = new Handle(ln3);
                _idTo = db.GetObjectId(false, hn3, 0);
            }
        }
        catch (Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }
        return Regen(hField, hFrom, hTo);
    }

    public bool RegisterEvent()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
            Entity fromEntity = tr.GetObject(_idFrom, OpenMode.ForWrite, false) as Entity;
            fromEntity.Modified += new EventHandler(SendCmdFromProp);
            tr.Commit();
        }
        return true;
    }

    public bool UnRegisterEvent()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
            Entity fromEntity = tr.GetObject(_idFrom, OpenMode.ForWrite, false) as Entity;
            fromEntity.Modified -= new EventHandler(SendCmdFromProp);
            tr.Commit();
        }
        return true;
    }

    public void SendCmdFromProp(object senderObj, EventArgs evtArgs)
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
            DBObject obj = tr.GetObject(_idFrom, OpenMode.ForRead);
            if (obj is BlockReference)
            {
                BlockReference blkRef = obj as BlockReference;
                if (blkRef.IsDynamicBlock)
                {
                    DynamicBlockReferencePropertyCollection pp = blkRef.DynamicBlockReferencePropertyCollection;
                    foreach (DynamicBlockReferenceProperty prop in pp)
                    {
                        doc.SendStringToExecute(prop.Value + " ", false, false, true);
                    }
                }
            }
            tr.Commit();
        }
    }

    public string Regen(string hField, string hFrom, string hTo)
    {
        return "명령어 선택 = ";
    }
}

[여행]호거산 운문사 (-청도)

호거산 운문사

운문사는 신라 진흥왕 18년 557 에 대작갑사로 창건되었다. 고려초 태조왕건이 "운문선사"로 사액을 내린 이후 운문사로 불리게 되었다. 고려말 일현선사가 주지로 주석하여 삼국유사를 저술한 곳이기도 하다. 방문하던 날은 그리 화창하지 않았지만 청도의 모든 산에는 구름이 걸려 잠시 시간이 멈춘듯 고요한 하루였다.









2012년 11월 22일 목요일

[동영상]TrueView에서 Ribbon생성 동영상

TrueView프로그램은 Autodesk사에서 제공하는 무료 뷰잉도구입니다.
물론 arx/dotnet과 같은 프로그램을 사용할 수 없습니다.
하지만 iDwgField 유틸을 사용하게되면 간단한 닷넷 코드를 실행시킬수 있습니다.
아래의 동영상은 웹의 블로거에 개시된 C#코드를 읽어서 도면이 열리고 Regen(재구성)될때
코드를 실행해 주는 기능을 보여줍니다.


2012년 11월 21일 수요일

[코드]TrueView - SendStringToExecute 사용 Ribbon (for AutoCAD R/LT/TV 2013)

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows;

using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;

namespace iDwgField.Ribbon.Utils
{
    public class TextboxCommandHandler : ICommand
    {
#pragma warning disable 67
        public event EventHandler CanExecuteChanged;
#pragma warning restore 67

        public bool CanExecute(object parameter)
        {
            // Yes, we can execute
            return true;
        }

        public void Execute(object parameter)
        {
            // Dump the textbox contents to the command-line
            NotifyingTextBox tb = parameter as NotifyingTextBox;
            if (tb != null)
            {
                Document doc = AcadApp.DocumentManager.MdiActiveDocument;
                doc.SendStringToExecute(tb.GetTextWithoutNewlines() + "\n", true, false, true);
                tb.ClearText();
            }
        }
    }

    public class NotifyingTextBox : RibbonTextBox
    {
        double _baseHeight;
        double _baseWidth;
        double _heightPadding;
        double _widthPadding;
        bool _textChanging = false;

        public NotifyingTextBox(
            double width, double height,
            double widthPadding,
            double heightPadding
        )
        {
            // Set some member variables, some of which
            // we also use to set the TextBox dimensions
            _baseWidth = width;
            _baseHeight = height;
            _widthPadding = widthPadding;
            _heightPadding = heightPadding;

            Width = width;
            Height = height;
            MinWidth = width;
        }

        public string GetTextWithoutNewlines()
        {
            // Return the contained text without newline characters
            return TextValue.ReplaceNewlinesWithSpaces();
        }

        public void ClearText()
        {
            TextValue = "";
        }
    }

    public static class StringExtensions
    {
        const string newline = "\r\n";

        public static string InsertNewlineAtLastSpace(this string s)
        {
            // If the string contains a space, replace it
            // with a newline character, otherwise we simply
            // append the newline to the string
            string ret;
            if (s.Contains(" "))
            {
                int index = s.LastIndexOf(" ");
                ret = s.Substring(0, index) + newline + s.Substring(index + 1);
            }
            else
            {
                ret = s + newline;
            }
            return ret;
        }

        public static string ReplaceNewlinesWithSpaces(this string s)
        {
            // Replace all the newlines with spaces

            if (String.IsNullOrEmpty(s))
                return s;
            return s.Replace(newline, " ");
        }

        public static string GetLastLine(this string s)
        {
            // Return the last line of the text (or
            // the whole thing if there's no newline in it)
            string ret;
            if (s.Contains(newline))
            {
                ret = s.Substring(s.LastIndexOf(newline) + newline.Length);
            }
            else
            {
                ret = s;
            }
            return ret;
        }

        public static int GetLineCount(this string s)
        {
            return ((s.Length - s.Replace(newline, "").Length) / newline.Length) + 1;
        }
    }
}

public class Script
{
    private static ObjectId _idField;
    private static ObjectId _idFrom;
    private static ObjectId _idTo;
    private static RibbonTab _rt = null;

    public void RibbonUi()
    {
        RibbonControl rc = ComponentManager.Ribbon;
        foreach (RibbonTab tab in rc.Tabs)
        {
            if (tab.AutomationName == "iDwgField-Ribbon")
            {
                _rt = tab;
                break;
            }
        }
        // If we didn't find it, create a custom tab
        if (_rt == null)
        {
            _rt = new RibbonTab();
            _rt.Title = "리본메뉴테스트";
            _rt.Id = "ID_IDWGFIELD_RIBBONTAB";
            rc.Tabs.Add(_rt);
        }
        else
        {
            _rt.IsActive = true;
            return;
        }

        // Create our custom panel, add it to the ribbon tab
        RibbonPanelSource rps = new RibbonPanelSource();
        rps.Title = "리본메뉴테스트";
        RibbonPanel rp = new RibbonPanel();
        rp.Source = rps;
        _rt.Panels.Add(rp);

        // Create our custom textbox, add it to the panel
        iDwgField.Ribbon.Utils.NotifyingTextBox tb = new iDwgField.Ribbon.Utils.NotifyingTextBox(150, 15, 5, 5);
        tb.IsEmptyTextValid = true;
        tb.AcceptTextOnLostFocus = true;
        tb.InvokesCommand = true;
        tb.CommandHandler = new iDwgField.Ribbon.Utils.TextboxCommandHandler();
        rps.Items.Add(tb);

        // Set our tab to be active
        _rt.IsActive = true;
    }

    public void CloseUi()
    {
        if (_rt != null)
        {
            RibbonControl rc = ComponentManager.Ribbon;
            rc.Tabs.Remove(_rt);
            _rt = null;
        }
    }

    public string Regen(string hField, string hFrom, string hTo)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;

            long ln1 = Convert.ToInt64(hField, 16);
            Handle hn1 = new Handle(ln1);
            _idField = db.GetObjectId(false, hn1, 0);

            long ln2 = Convert.ToInt64(hFrom, 16);
            if (ln2 > 0)
            {
                Handle hn2 = new Handle(ln2);
                _idFrom = db.GetObjectId(false, hn2, 0);
            }

            long ln3 = Convert.ToInt64(hTo, 16);
            if (ln3 > 0)
            {
                Handle hn3 = new Handle(ln3);
                _idTo = db.GetObjectId(false, hn3, 0);
            }

            RibbonUi();
        }
        catch (Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }

        return "Ribbon 로딩됨";
    }

    public string Open(string hField, string hFrom, string hTo)
    {
        RibbonUi();

        return Regen(hField, hFrom, hTo);
    }

    public void Exit(string msg)
    {
        CloseUi();
    }
}

Post ID 따는 방법

1. 우선 글쓰기로 신규 POST를 추가한다.

2. 목록으로 이동한다.
http://www.blogger.com/blogger.g?blogID=4104225603923795693#allposts

3. 해당항목에 마우스를 갖다 놓는다.

4. POSTID의 번호를 복사한다.

5. AutoCAD에서 Field객체의 맨위쪽에 //{GA}{41042256039237} 와 같이 등록한다.

6. Field객체가 처음로딩된 후 라면 AutoCAD를 종료하고 다시 구동한다.

웹연동 식별정보

웹연동 식별정보 비암호화 -> "//{GA}{6786259345214464288} - 주석" 암호화 -> "//{GZ}{6786259345214464288} - 주석" 코드포함 -> "//{LO}{6786259345214464288} - 주석" G : 구글 블로그 M : 마이크로소프트사 블로그 LO : 필드에 코드포함 A : 일반코드 Z : 암호화코드 6786259345214464288 : 블로그 포스트 아이디 (19자리)

[코드]비암호 웹링크 테스트

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;

using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;

public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;

    public string Open(string hField, string hFrom, string hTo)
    {
        return Regen(hField, hFrom, hTo);
    }

    public string Regen(string hField, string hFrom, string hTo)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;

            long ln1 = Convert.ToInt64(hField, 16);
            Handle hn1 = new Handle(ln1);
            _idField = db.GetObjectId(false, hn1, 0);

            long ln2 = Convert.ToInt64(hFrom, 16);
            if(ln2>0){
            Handle hn2 = new Handle(ln2);
            _idFrom = db.GetObjectId(false, hn2, 0);
            }

            long ln3 = Convert.ToInt64(hTo, 16);
            if(ln3>0){
            Handle hn3 = new Handle(ln3);
            _idTo = db.GetObjectId(false, hn3, 0);
            }
        }
        catch(Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }
        return "암호되지 않은 블로그 POST코드 테스트2";
    }

    public bool Modified(string hnd)
    {
        return true;
    }

    public bool Erased(string isErasing)
    {
        return true;
    }

    public bool Copied(string newId)
    {
        return true;
    }

    public bool Exit(string msg)
    {
        return true;
    }
}

2012년 11월 20일 화요일

[코드]암호화 웹링크 테스트

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

2012년 11월 16일 금요일

[아이디어]구글 블로거를 이용하자

필드객체는 스크립트 코드를 포함하고 있으므로 용량의 증가가 예상된다

특히 동일한모듈을 사용하게 되면 스크립트 코드가 중복으로 존재하므로 더욱더 낭비가 심해진다 따라서 스크립트 코드를 웹에 퍼블리싱하고 식별 아이디 만을 필드 객체가 포함하여 도면에 생성시에 모듈화 하게 되면 매우 효과적으로 관리될것 같다

구글 API V2.0 사용함

[코드]계산기 코드 수정 (postID=3500529843995694161)

using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;
public class MathParser
{
    public static double EvalExpression(char[] expr)
    {
        return parseSummands(expr, 0);
    }
    private static double parseSummands(char[] expr, int index)
    {
        double x = parseFactors(expr, ref index);
        while (true)
        {
            char op = expr[index];
            if (op != '+' && op != '-')
                return x;
            index++;
            double y = parseFactors(expr, ref index);
            if (op == '+')
                x += y;
            else
                x -= y;
        }
    }
    private static double parseFactors(char[] expr, ref int index)
    {
        double x = GetDouble(expr, ref index);
        while (true)
        {
            char op = expr[index];
            if (op != '/' && op != '*')
               return x;
            index++;
            double y = GetDouble(expr, ref index);
            if (op == '/')
                x /= y;
            else
                x *= y;
        }
    }
    private static double GetDouble(char[] expr, ref int index)
    {
        string dbl = "";
        while (((int)expr[index] >= 48 && (int)expr[index] < 57) || expr[index] == 46)
        {
            dbl = dbl + expr[index].ToString();
            index++;
            if (index == expr.Length)
            {
                index--;
                break;
            }
        }
        return double.Parse(dbl);
    }
}
public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;
    private string _bkValue;
    public string Open(string hField, string hFrom, string hTo)
    {
        _bkValue = hField;
        return Regen(hField, hFrom, hTo);
    }
    public string Regen(string hField, string hFrom, string hTo)
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
            long ln1 = Convert.ToInt64(hField, 16);
            Handle hn1 = new Handle(ln1);
            _idField = db.GetObjectId(false, hn1, 0);
            long ln2 = Convert.ToInt64(hFrom, 16);
            if(ln2>0){
            Handle hn2 = new Handle(ln2);
            _idFrom = db.GetObjectId(false, hn2, 0);
            }
            long ln3 = Convert.ToInt64(hTo, 16);
            if(ln3>0){
            Handle hn3 = new Handle(ln3);
            _idTo = db.GetObjectId(false, hn3, 0);
            }
            string evalStr = null;
            Entity fromEntity = tr.GetObject(_idFrom, OpenMode.ForRead, false) as Entity;
            if (fromEntity == null)
            {
            }
            if (fromEntity .GetType() == typeof(MText))
            {
                evalStr  = ((MText)fromEntity ).Contents;
            }
            else
            {
                evalStr  = ((DBText)fromEntity ).TextString;
            }
            string result = MathParser.EvalExpression(evalStr.ToCharArray()).ToString(); 
            Entity toEntity = tr.GetObject(_idTo, OpenMode.ForWrite, false) as Entity;
            if (toEntity == null)
            {
            }
            if (toEntity .GetType() == typeof(MText))
            {
               ((MText)toEntity ).Contents = result.ToString();
            }
            else
            {               
                ((DBText)toEntity ).TextString = result.ToString();
            }
 tr.Commit();
        }
        return _bkValue;
    }
    public void Modified(string hnd)
    {
    }
    public void Erased(string isErasing)
    {
    }
    public void Copied(string newId)
    {
    }
    public void Exit(string msg)
    {
    }
}

2012년 11월 15일 목요일

모듈관리

스크립트 코드의 모듈은 프로세스가 종료되기전까지 메모리에 남아있게된다 그러므로 동일한 문서에서 또는 서로다른 문서에서 로딩된 모듈을 로딩하려한다면 클래스 선언 충돌이 발생한다
그래서 동일한 스크립트 모듈임을 식별해서 공통으로 사용하는 방식으로 변경하였다

정적(static)함수들을 일반 함수로 변경하였다 이제는 필드 객체별로 인스탄스 영역을 사용할수 있게되었다 스크립트 클래스의 맴버값이 동일 모듈을 사용하는 필드 객체에 영향을 받지않게되었다

Main함수 이름 변경

Field가포함된 도면이 열리거나 신규 생성이 된다면 내부적으로 Open이벤트가 호출된다 따라서 Main 이 가지는 기능과 동일하므로 Open으로 이름을 바꿨다

iDwgField 와 Ribbon메뉴의 만남


2012년 11월 14일 수요일

사용자입력 클래스 문제

필드객체의 동작은 명령어의 실행을 통해서가 아니라 문서의 이벤트를 받아서 처리하는것을 원칙으로하고있습니다
따라서 사용자 입력 클래스와같이 명령호출 메카니즘과 밀접한 클래스를 필드객체에서 사용하게되면 실행이되지않거나 랙에 빠질위험이 발생됩니다


9호선 구반포역

9호선 구반포역에서 열차를 기다리고 있음
 
 

2012년 11월 13일 화요일

동일한도면에서 동일한 Field객체 관리

실행코드를 포함하고있는 Field객체가 동일한도면에 한개이상 사용하게 되면 닷네모듈이 개수만큼 실행되게 됩니다 이때 동일한 클래스 이름으로 인한 충돌이 발생할수 있으므로 인스턴스된 객체의 핸들로 구분되는 네임스페이스를 가지게 함으로 클래스의 충돌을 피할 수 있습니다

다이나믹블럭과 Field 객체와 만남

다이나믹 블럭은 잘 알고계시듯이 매개변수 등의 속성을 블럭에 추가하여 유용한 기능을 지원하는 객체입니다.

이 객체의 특징중에서 가시성 기능이 있습니다.

이 기능은 다이나믹 객체가 선택되었을때 가시성 아이콘이 활성화되고 화살표를 클릭했을때 팝업메뉴로 가시성 타입을설정할수있습니다 따라서 다이나믹블럭의 가시성 정보가 바뀌는 이벤트를 받아서 Field 객체가 동작하게 한다면 다양한 효과를 구현할수 있게되죠.

1. 캐드명령의 실행


마이크로소프트사의 음성서비스 사용

캐드도면에 Field 객체를 생성합니다 그리고 C#코드에는 from 객체의 (문자열)의 내용을 읽어와서 MS의 음성 서비스를 호출합니다 이렇게되면 도면의 특정 문자열을 읽어 주게됩니다.

iDwgField 보안정책

iDwgField프로그램은 캐드의 필드 객체에 프로그래밍이가능하도록 기능화 되었습니다 따라서 악의적인코드와 저작권 보호 차원에 취약합니다 우선 코드의 생성가능한 arx프로그램은 신뢰할수 있는 그룹에의해 관리되어야 합니다
프로그래밍돤 필드 객체의 C#코드는 철처하게 암호화 되므로 DBX 프로그램 만으로 코드를 보거나 변형이 불가합니다
또한 코드로 인한 DWG 용량의 증가는 인터넷의 사설위치를 설정할수있도록 지원하므로써 DWG의 용량을 최소화 할 수 있습니다

TrueView 에서 iDwgField어플 사용


TrueView가 어떤프로그램인지 아실겁니다 오토캐드에서 무료로 제공하는 뷰어 입니다 이프로그램에서 iDwgField를 사용하게되면 Doc기반의 닷넷프로그램을사용할수있습니다
즉 문서만 열어도 프로그램을 실행시킬수 있습니다
1. Ribbon 메뉴를 추가할수 있습니다
2. 닷넷코드를 실행할수 있습니다
3. 트루뷰의 기본명령을 실행시킬수있습니다

Field객체의 이벤트 처리

Field객체는 도면에 포함되는 엔티티 이므로

객체의 생성은 Document의 이벤트와 매우 밀접한 관계를 가진다.

이와같은 캐드상에서의 이벤트를 iDwgField객체의 c#스크립트에

이벤트를 발생시키는 방식은 다음과 같다.

1. AcDbField::kOpen

2. AcDbField::kSave

3. AcDbField::kPlot

4. AcDbField::kEtransmit

5. AcDbField::kRegen

6. AcDbField::kDemand

7. AcDbField::kPreview

8. AcDbField::kPlotPreview

따라서 스크립트상에서 다음과 같은 정적함수를 선언하게되면

iDwgField프로그램은 이벤트를 전달해준다.

public class Script
{
    //스크립트의 엔트리포인트
    public static string Main(string,string,string)
   {
         return "Main";
    }

    public static string Open()
    {
        return "Open";
    }

    public static string Save()
   {
        return "Save";
    }

    ... ....
}

2012년 11월 12일 월요일

핸들 문자열로 부터 ObjectId 객체만들기



Database db = doc.Database;

long ln1 = Convert.ToInt64(hField, 16);
Handle hn1 = new Handle(ln1);
ObjectId _idField = db.GetObjectId(false, hn1, 0);

[코드]계산기기능 (postID=3352286799413239524)


using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
 
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;
 
public class MathParser
{
    public static double EvalExpression(char[] expr)
    {
        return parseSummands(expr, 0);
    }
    private static double parseSummands(char[] expr, int index)
    {
        double x = parseFactors(expr, ref index);
        while (true)
        {
            char op = expr[index];
            if (op != '+' && op != '-')
                return x;
            index++;
            double y = parseFactors(expr, ref index);
            if (op == '+')
                x += y;
            else
                x -= y;
        }
    }
    private static double parseFactors(char[] expr, ref int index)
    {
        double x = GetDouble(expr, ref index);
        while (true)
        {
            char op = expr[index];
            if (op != '/' && op != '*')
               return x;
            index++;
            double y = GetDouble(expr, ref index);
            if (op == '/')
                x /= y;
            else
                x *= y;
        }
    }
    private static double GetDouble(char[] expr, ref int index)
    {
        string dbl = "";
        while (((int)expr[index] >= 48 && (int)expr[index] < 57) || expr[index] == 46)
        {
            dbl = dbl + expr[index].ToString();
            index++;
            if (index == expr.Length)
            {
                index--;
                break;
            }
        }
        return double.Parse(dbl);
    }
}
 
public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;
 
    public string Open(string hField, string hFrom, string hTo)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;
 
            long ln1 = Convert.ToInt64(hField, 16);
            Handle hn1 = new Handle(ln1);
            _idField = db.GetObjectId(false, hn1, 0);
 
            long ln2 = Convert.ToInt64(hFrom, 16);
            if(ln2>0){
            Handle hn2 = new Handle(ln2);
            _idFrom = db.GetObjectId(false, hn2, 0);
            }
 
            long ln3 = Convert.ToInt64(hTo, 16);
            if(ln3>0){
            Handle hn3 = new Handle(ln3);
            _idTo = db.GetObjectId(false, hn3, 0);
            }
        }
        catch(Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }
        return Regen(hField, hFrom, hTo);
    }
 
    public string Regen(string hField, string hFrom, string hTo)
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
                string evalStr = null;
                Entity fromEntity = tr.GetObject(_idFrom, OpenMode.ForRead, false) as Entity;
                if (fromEntity == null)
                {
                }
                if (fromEntity .GetType() == typeof(MText))
                {
                    evalStr  = ((MText)fromEntity ).Contents;
                }
                else
                {
                    evalStr  = ((DBText)fromEntity ).TextString;
                }
 
                string result = MathParser.EvalExpression(evalStr.ToCharArray()).ToString();  
 
                Entity toEntity = tr.GetObject(_idTo, OpenMode.ForWrite, false) as Entity;
                if (toEntity == null)
                {
                }
                if (toEntity .GetType() == typeof(MText))
                {
                    ((MText)toEntity ).Contents = result.ToString();
                }
                else
                {
                    ((DBText)toEntity ).TextString = result.ToString();
                }
                tr.Commit();
        }
        return "계산기";
    }
 
    public void Modified(string hnd)
    {
    }
 
    public void Erased(string isErasing)
    {
    }
 
    public void Copied(string newId)
    {
    }
 
    public void Exit(string msg)
    {
    }
}

[코드]bing 번역기 (postID=5310951502590631750)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.Web;
using System.ServiceModel.Channels;
using System.ServiceModel;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;

using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using WinApp = System.Windows.Forms.Application;

namespace MSTranslatorSdk
{
    [DataContract]
    public class AdmAccessToken
    {
        [DataMember]
        public string access_token { get; set; }
        [DataMember]
        public string token_type { get; set; }
        [DataMember]
        public string expires_in { get; set; }
        [DataMember]
        public string scope { get; set; }
    }

    public class AdmAuthentication
    {
        public static readonly string DatamarketAccessUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
        private string clientId;
        private string cientSecret;
        private string request;

        public AdmAuthentication(string clientId, string clientSecret)
        {
            this.clientId = clientId;
            this.cientSecret = clientSecret;
            //If clientid or client secret has special characters, encode before sending request
            this.request = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));
        }

        public AdmAccessToken GetAccessToken()
        {
            return HttpPost(DatamarketAccessUri, this.request);
        }

        private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
        {
            //Prepare OAuth request
            WebRequest webRequest = WebRequest.Create(DatamarketAccessUri);
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.Method = "POST";
            byte[] bytes = Encoding.ASCII.GetBytes(requestDetails);
            webRequest.ContentLength = bytes.Length;
            using (Stream outputStream = webRequest.GetRequestStream())
            {
                outputStream.Write(bytes, 0, bytes.Length);
            }
            using (WebResponse webResponse = webRequest.GetResponse())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
                //Get deserialized object from JSON stream
                AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
                return token;
            }
        }
    }
}

public class Script
{
    private ObjectId _idField;
    private ObjectId _idFrom;
    private ObjectId _idTo;

    private static void WriteLine(string msg)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        ed.WriteMessage(msg);
    }

    public string Open(string hField, string hFrom, string hTo)
    {
        Document doc = AcadApp.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        try
        {
            Database db = doc.Database;

            long ln1 = Convert.ToInt64(hField, 16);
            Handle hn1 = new Handle(ln1);
            _idField = db.GetObjectId(false, hn1, 0);

            long ln2 = Convert.ToInt64(hFrom, 16);
            if(ln2>0){
            Handle hn2 = new Handle(ln2);
            _idFrom = db.GetObjectId(false, hn2, 0);
            }

            long ln3 = Convert.ToInt64(hTo, 16);
            if(ln3>0){
            Handle hn3 = new Handle(ln3);
            _idTo = db.GetObjectId(false, hn3, 0);
            }
        }
        catch(Autodesk.AutoCAD.Runtime.Exception e)
        {
            return e.Message;
        }
        return "Loaded";
    }

        private void DetectMethod(string authToken)
        {
            string textToDetect = "Console";
            //Keep appId parameter blank as we are sending access token in authorization header.
            string uri = "http://api.microsofttranslator.com/v2/Http.svc/Detect?text=" + textToDetect;
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
            httpWebRequest.Headers.Add("Authorization", authToken);
            WebResponse response = null;
            try
            {
                response = httpWebRequest.GetResponse();
                using (Stream stream = response.GetResponseStream())
                {
                    System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"));
                    string languageDetected = (string)dcs.ReadObject(stream);
                    WriteLine(string.Format("\nLanguage detected:{0}", languageDetected));
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                    response = null;
                }
            }
        }

        private string TranslateMethod(string authToken)
        {
            string text = "Use pixels to express measurements for padding and margins.";
            string from = "en";
            string to = "de";

            string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Web.HttpUtility.UrlEncode(text) + "&from=" + from + "&to=" + to;

            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
            httpWebRequest.Headers.Add("Authorization", authToken);
            WebResponse response = null;
            try
            {
                response = httpWebRequest.GetResponse();
                using (Stream stream = response.GetResponseStream())
                {
                    System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"));
                    string translation = (string)dcs.ReadObject(stream);
                    WriteLine(string.Format("\nTranslation for source text '{0}' from {1} to {2} is", text, "en", "de"));
                    return translation;

                }
            }
            catch
            {
                throw;
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                    response = null;
                }
            }
            return "fail";
        }

        private void ProcessWebException(WebException e)
        {
            WriteLine(string.Format("{0}", e.ToString()));
            // Obtain detailed error information
            string strResponse = string.Empty;
            using (HttpWebResponse response = (HttpWebResponse)e.Response)
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader sr = new StreamReader(responseStream, System.Text.Encoding.ASCII))
                    {
                        strResponse = sr.ReadToEnd();
                    }
                }
            }
            WriteLine(string.Format("Http status code={0}, error message={1}", e.Status, strResponse));
        }


    public string Regen(string hField, string hFrom, string hTo)
    {
        string result = string.Empty;

            MSTranslatorSdk.AdmAccessToken admToken;
            string headerValue;
            string client_id = "mytranslator_arx119";
            string client_secret = "<??>";
            MSTranslatorSdk.AdmAuthentication admAuth = new MSTranslatorSdk.AdmAuthentication(client_id, client_secret);
            try
            {
                admToken = admAuth.GetAccessToken();
                headerValue = "Bearer " + admToken.access_token;
                DetectMethod(headerValue);
                result = TranslateMethod(headerValue);
            }
            catch (WebException e)
            {
                ProcessWebException(e);
            }
            catch (System.Exception ex)
            {
                WriteLine(ex.Message);
            }

        return result;
    }

    public void Modified(string hnd)
    {
    }

    public void Erased(string isErasing)
    {
    }

    public void Copied(string newId)
    {
    }

    public void Exit(string msg)
    {
    }
}