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일 화요일

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

oMSvy8aytc7KyLXK0tq919PU2sLh29XC19vhysnf5szjwc7S5ufV08js1/Pu2t328vDd8voC5f/7/ALqCQP96v8DCfLxBw70C+n2+g4P/fvwFP8bFgIFHhoYBRoiKg0nIyQqEjErJRInKzEaGS82HDMRHiI2NyUjGDwnQz4qLUZCQC1CSlI1T0tMUjpZU006T1NZQkFXXkRbOUZKXl9NS0BkT2tmUlVuamhVanJ6XXdzdHpigXt1Ynd7gWppf4Zsg2FucoaHdXNojHeTjnp9lpKQfZKaooWfm5yiiqmjnYqfo6mSkaeulKuJlpqur52bkLSfu7aipb66uKW6wsqtx8PEyrLRy8Wyx8vRurnP1rzTsb7C1tfFw7jcx+Peys3m4uDN4ury1e/r7PLa+fPt2u/z+eLh9/7k+9nm6v7/7evgBO8LBvL1DgoI9QoSGv0XExQaAiEbFQIXGyEKCR8mDCMBDhImJxUTCCwXMy4aHTYyMB0yOkIlPzs8QipJQz0qP0NJMjFHTjRLKTY6Tk89OzBUP1tWQkVeWlhFWmJqTWdjZGpScWtlUmdrcVpZb3Zcc1FeYnZ3ZWNYfGeDfmpthoKAbYKKknWPi4ySepmTjXqPk5mCgZeehJt5hoqen42LgKSPq6aSla6qqJWqsrqdt7O0uqLBu7Wit7vBqqm/xqzDoa6yxse1s6jMt9POur3W0tC90trixd/b3OLK6ePdyt/j6dLR5+7U68nW2u7v3dvQ9N/79uLl/vr45foCCu0HAwQK8hELBfIHCxH6+Q8W/BPx/gIWFwUD+BwHIx4KDSYiIA0iKjIVLyssMho5My0aLzM5IiE3PiQ7GSYqPj8tKyBEL0tGMjVOSkg1SlJaPVdTVFpCYVtVQldbYUpJX2ZMY0FOUmZnVVNIbFdzblpddnJwXXJ6gmV/e3yCaomDfWp/g4lycYeOdItpdnqOj317cJR/m5aChZ6amIWaoqqNp6OkqpKxq6WSp6uxmpmvtpyzkZ6itrelo5i8p8O+qq3GwsCtwsrStc/LzNK62dPNus/T2cLB197E27nGyt7fzcvA5M/r5tLV7uro1ery+t338/T64gH79eL3+wHq6f8G7APh7vIGB/Xz6Az3Ew76/RYSEP0SGiIFHxscIgopIx0KHyMpEhEnLhQrCRYaLi8dGxA0Hzs2IiU+OjglOkJKLUdDREoyUUtFMkdLUTo5T1Y8UzE+QlZXRUM4XEdjXkpNZmJgTWJqclVva2xyWnlzbVpvc3liYXd+ZHtZZmp+f21rYIRvi4ZydY6KiHWKkpp9l5OUmoKhm5WCl5uhiomfpoyjgY6SpqeVk4isl7Oump22srCdsrrCpb+7vMKqycO9qr/DybKxx860y6m2us7Pvbuw1L/b1sLF3trYxdri6s3n4+Tq0vHr5dLn6/Ha2e/23PPR3uL29+Xj2PznA/7q7QYCAO0CChL1DwsMEvoZEw36DxMZAgEXHgQb+QYKHh8NCwAkDysmEhUuKigVKjI6HTczNDoiQTs1Ijc7QSopP0YsQyEuMkZHNTMoTDdTTjo9VlJQPVJaYkVfW1xiSmljXUpfY2lSUWduVGtJVlpub11bUHRfe3ZiZX56eGV6gopth4OEinKRi4Vyh4uRenmPlnyTcX6ClpeFg3ich6Oeio2moqCNoqqyla+rrLKaubOtmq+zuaKht76ku5mmqr6/raugxK/LxrK1zsrItcrS2r3X09TawuHb1cLX2+HKyd/mzOPBztLm59XTyOzX8+7a3fby8N3y+gLl//v8AuoJA/3q/wMJ8vEHDvQL6fb6Dg/9+/AU/xsWAgUeGhgFGiIqDScjJCoSMSslEicrMRoZLzYcMxEeIjY3JSMYPCdDPiotRkJALUJKUjVPS0xSOllTTTpPU1lCQVdeRFs5RkpeX01LQGRPa2ZSVW5qaFVqcnpdd3N0emKBe3Vid3uBaml/hmyDYW5yhod1c2iMd5OOen2WkpB9kpqihZ+bnKKKqaOdip+jqZKRp66Uq4mWmq6vnZuQtJ+7tqKlvrq4pbrCyq3Hw8TKstHLxbLHy9G6uc/WvNOxvsLW18XDuNzH497Kzebi4M3i6vLV7+vs8tr58+3a7/P54uH3/uT72ebq/v/t6+AE7wsG8vUOCgj1ChIa/RcTFBoCIRsVAhcbIQoJHyYMIwEOEiYnFRMILBczLhodNjIwHTI6QiU/OzxCKklDPSo/Q0kyMUdONEspNjpOTz07MFQ/W1ZCRV5aWEVaYmpNZ2NkalJxa2VSZ2txWllvdlxzUV5idndlY1h8Z4N+am2GgoBtgoqSdY+LjJJ6mZONeo+TmYKBl56Em3mGip6fjYuApI+rppKVrqqolaqyup23s7S6osG7taK3u8Gqqb/GrMOhrrLGx7WzqMy30866vdbS0L3S2uLF39vc4srp493K3+Pp0tHn7tTrydba7pSTlMgBwuO94NED8AyW/uqr7e704vHy+OTM7dDfFhHfGL8c4hfTAa77sCAk5erP2ssI9NnaE94m2z8CCRQZxtrSMe5DJD4CHzMm/0j7N9Ui8R0G3xQPEgwwB1BBXO1d70H5AjEyNP8C+h30LU1wNixhC3McdQhCDEsPZEF5PVtEWDB7XIRQUBFIJJAdfRpjZxd9OJNyViA9SmdPnF6HRoJpdEmLZIM/boCcoG6sgGB7h42OgT2RQ1JDqU+7mrZal3KeZ8DFe5JRm1u0j8nOq3yoZ8te1KjGtnO1tobQft3Ahae1poGMrnPZyOt07aC6m8ODwqjW6Iz8gsmn4Pyu7p2bot6U0uXiotQI3QHPDwHgCBPB9tD/ruqk5cgcth79ELnp5sDo+BbzuAUG+bbQxQj8GdfvFPjSAeII/yjiLgrdEzAsGkFGIzggEUPoTCAYGxAtJyHuMfjy30niWyb+5/YMAAccKhsA9/Q1KCQoKCxuDzkvBQ9IZAlFEBESA1kZghIwFkGGQiIrMyNQkEpDJRgmb0WNLX11ZSCLQzg7cFJrfH0/cVGBgkKHmX2riKZDh2WOs0NpZkhGSGNvamZ5Wm1liV9VxJi2T2NnppuahqqnnJWlcJeMyXmQc9uX3Zuqi7NpstzGqMyZjX13t6R93r/KzZSJiZeEhJDloPuZ5tLertW+5bPVsNqT1fQMxA6tAK/ZubDI6Nfjs/X66ab5vu+n7K79Gwu2KRkG7ijnF8EC1f3wNOA2GyjeAfjYARDxCy3hHtLL5+gh2znvBxUQ5xhBLhJFDj/mDe3qFxYJEDsVOPtbLGQuMB8oCnAgXQ/9Njx3RWcRdj4XPyJYO2RzUVIKXCB2SX9jf2x8UE5JYFBbiW02YWJxdjIgiSGbdpYtdzN+W6CdVjg4OH1VaGZoWa+Il3VAZoF5XH+4Ua9YmZpajLGVw2G+jp+5psvIzbfEoridkdTRbrOJsG/TtLZkqWaEvYN5noeKdbTZfNbL5n2Vr4unm6TfwqK/hK+2vMKJrL6Mw6gEjLuZ6dat4Kjils+t2+UTtQ6i78X24BjWB8jyq+0MJNwmxRjH8dEb4Lnvt9PZ1MK9EcLH6SkN/xT01CXq+fH9+QPj8RvX8QISE+//6u0AWQTkRivz8zboKv1kLU8UT18mXkcHFAj/VzFjAUIqTVxtLV08RQRrMhg/UChLXV1DUVJhHSIgeR6LU4YdZ09uQ0WVamKEa2WEnH+eoJBxaWhAYXhoc6E4QpxBs19KfKFBs7quUo9oloC4c6dMVWpMrHh+hU9wX5l1yYNtkGebcq5domyypaSCx9med79qlWqfo6pseZuZkZjmsnyetciHr7yLgbqG1pCRy5C0nNKxstXG3q6ik7qvvcvGwazis5j8DRHz897w4fm49/DX6+X9IfG+AbLCu+LPBggM5wchDuIw5B/BCr8F4Tw5Ptow3wkH4AYYCeUT4FDlPdRUHD//MFMzE+s9AhsPFR4U6wXs7BgnESvzXx9cbS4dQBk7PU0TQRxRWBIVaRx7XDMKgiuEPIAYb1haEFU3jDWOGoAfWRpelCWRLzMgJjc6P1k6MpMuNYxjbkRcQ2VqZp9Le1B/gpuWk4p+XoF+WHOQgoucUF+0Wctmh2STbcvKxqSnkK6YgJSSaWx5aZKVlp2K0IZrpsObb6p3xMWHnIGOjsaMmJW58rfMko2SnACctI+en5+/vaLA5bup0bLwz5bCl/L0mgStG9Gy5AnyG7kWtrDhI8QG6Q+x+r71sywpLsYg1vn00OXa+b79wTnUMMs9ICUx0vcg7M3S++P5PxIi5jzZHeNUAFbySPf8Gx0MSg1OLWcbMTRBHgITWSAbTBsKCTYSFDlvHAtKHgcnNzU5HiwMSTB9Iyp2EmIWLBQhJRsyJ1J/R1Y8dzZSOElTUYclKyg+VUleVF5ZjkJHkUs2PziSlDqkTbtxUoqpSLuItklQdcN+pnmvXZp8lbTMhM5twG+ZenCHeqBemGGvdGVrfcBz0YGXw4yBcoeD5d+Rwpncpr2l9J32gOivnP29teq/7tgHmtGT4Y6in/m+u6m7m6m7sszZxLyt6gWn79cQ2afMq+nLH+KvrcP1zMu0xsXR0rjy4ufT3OLWytja8/gn1sjgyMv3Q9/q/NEYCA0QOvsbFy3ZIQExMi3hJOM1Qlb3NyY+OWBCT0s6DjUXbCgcFCX+DRk9NxoXCVBVBxUJCxxHCzQhbGJrMolzZi+ILnc7YhowUHE+bFRlfotaOE1wUWt3fUNBPiwthFNVfWKEZUSHWkxic2porD6ghblhaGZYaVldhGh6a4hfoFd3YFxvb6ljwXGOsn1fdIK/l72NrXqylK3W5H3mpJ+h3K6uoMCxu+zN1MGH0YOSf+mJ+9ykmprGiqStBb2PkJHVu8C4vJjVEpz4p/39wQ3w9aLpt/mxut3c9f78BLy60ivaDuI

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)
    {
    }
}