C# ile AutoCAD 2015 eklentileri geliştirme

Okuma Süresi: 2 dakika

AutoCAD 2015 için eklenti geliştirebilmek için ilk önce OrbjectARX kütüphanesini bilgisayarımıza yüklememiz gerekmektedir. ObjectARX indirme sayfasına girdiğimizde formu doldurup ObjectARX for AutoCAD 2015 (32-bit and 64-bit) seçeneğini seçerek kütüphaneyi bilgisayarımıza indirelim ve kurulumunu gerçekleştirelim.

Daha sonra Visual Studio için proje şablonunun kurulma işlemi var. AutoCAD 2015 .NET Wizards eklentisini http://images.autodesk.com/adsk/files/AutoCAD_2015-2016_DotNet_Wizards.zip adresinden indirip bilgisayarınıza kurabilirsiniz.

Kurulum işlemi bittikten sonra Visual Studio’yu çalıştıralım ve File -> New Project (CTRL + Shift + N) komutuna tıklayalım.

Visual Studio AutoCAD Project Template

 

Autodesk sekmesinin altında bulunan AutoCAD 2015 CSharp plugin‘i seçelim ve projemizi oluşturalım. OK tuşuna bastığımızda aşağıdaki gibi bir ekran gelecektir.

AutoCAD .NET Wizard Configurator

Specify the location of the folder inside the ObjectARX SDK that contains AcMgd.dll yazan bölüme ObjectARX’i kurduğumuz klasörün altında bulunan inc klasörünü gösteriyoruz. Benim bilgisayarımda C:\ObjectARX 2015\inc klasörü altında bulunmaktadır.

Specify the AutoCAD executable location yazan bölüme ise AutoCAD’i kurduğumuz klasörü yazıyoruz. Benim bilgisayarımda C:\Program Files\Autodesk\AutoCAD 2015 klasörü altında bulunmaktadır.

Bu değerleri girdikten sonra OK tuşuna basalım ve otomatik olarak projemizin ayarlarının yapılmasını bekleyelim. Projemiz oluşturulduğunda aşağıdaki gibi bir solution’ımız olacaktır.

AutoCAD 2015 Solution Tree

myPlugin sınıfının altında Initialize ve Terminate isminde iki adet metodumuz bulunmaktadır.

Initialize metodu eklentimiz AutoCAD tarafından ilk yüklendiği zaman çalışacak olan metoddur.
Terminate metodu ise AutoCAD tarafından eklentiğimiz sonlandırıldığı zaman çalışacak olan metoddur. Eklentinin yüklenmesinde veya sonlandırılmasında çalışmasını istediğiniz kodları bu alanlara yazabilirsiniz.

myCommands sınıfında ise AutoCAD’in Command kısmında yazarak çalışmasını istediğimiz komutların çalışmasını sağlayan metodların olduğu yerdir.

Şimdi AutoCAD’in mesaj alanına Hello World yazan örnek kod yazalım. Örnek kodumuz aşağıdaki gibidir.

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;

[assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in1.MyCommands))]

namespace AutoCAD_CSharp_plug_in1
{
    public class MyCommands
    {
        [CommandMethod("HelloWorld")]
        public void HelloWorld()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed;
            if (doc != null)
            {
                ed = doc.Editor;
                ed.WriteMessage("Hello World AutoCAD :)");

            }
        }
    }
}

CommandName attribute’üne parametre olarak geçtiğimiz string ifade AutoCAD tarafında komutumuzun ismidir. Daha sonra Document tipinde, doc isminde bir değişken tanımlayarak AutoCAD tarafında aktif olan çizimin nesne örneğini alıyoruz ve WriteMessage metoduyla AutoCAD’in mesaj alanına mesajımızı yazdırıyoruz.

Şimdi Visual Studio üzerinde yazılımımızı çalıştıralım. Eğer kodlarımızda herhangi bir hata yoksa otomatik olarak AutoCAD’de açılacaktır. AutoCAD açıldıktan sonra Command paneline NETLOAD komutunu yazıp Enter tuşuna basalım.

AutoCAD Command Panel

NETLOAD komutu .NET Framework ile geliştirilmiş AutoCAD eklentilerini AutoCAD tarafına yüklenmesini sağlamaktadır. Ekran dosya seçme ekranı gelecektir. Gelen ekranda projemizin derlenmiş DLL dosyasını seçelim.

Choose .NET Assembly

Eğer Security Concern ekranı gelirse Load düğmesine basarak eklentinin yüklenmesini sağlayalım.

Yükleme sırasında herhangi bir problem oluşmadıysa Command Panel alanına HelloWorld yazalım.

Command Panel Hello World

Enter tuşuna bastığımızda mesaj penceresine Hello World AutoCAD 🙂 yazacaktır.

Command Panel Hello World Result

Ayrıca AutoCAD’in .NET Framework API’si ile ilgili daha fazla bilgi almak isterseniz bu sayfadan yararlanabilirsiniz.

C# ile SVG’den PDF’e Dönüştürme

Okuma Süresi: 1 dakika

C# ile SVG ile oluşturulan grafikleri PDF çevirmek için internette pek çok 3. parti kütüphaneler bulunmaktadır. Ancak bu kütüphanelerin çoğu ücretlidir.

Inkscape ücretsiz bir vektörel grafik yazılımıdır. Inkscape’i komut satırından çalıştırarak çeşitli işlemleri yaptırabiliyoruz. Bizde uygulamamız içerisinden Inkscape’i çalıştırarak SVG formatındaki dosyalarımızı PDF formatına çevirebiliriz.

İlk önce buraya tıklayarak Inkscape’i bilgisayarımıza indiriyoruz. Daha sonra Visual Studio üzerinde bir Windows Form projesi açalım ve projemizin ana dizinine Inkscape klasörünü kopyalayalım. Aşağıdaki şekilde formumuzu tasarlayalım.

Formu bu şekilde tasarladıktan sonra aşağıdaki şekilde kodlarımızı yazalım.

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace SVGtoPDF
{
    public partial class Form1 : Form
    {
        string SVGFile = String.Empty;
        string PDFFile = String.Empty;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnSVGSec_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog dialog = new OpenFileDialog())
            {
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    SVGFile = dialog.FileName;
                    txtSVG.Text = SVGFile;
                }
            }
        }

        private void btnPDF_Click(object sender, EventArgs e)
        {
            using (SaveFileDialog dialog = new SaveFileDialog())
            {
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    PDFFile = dialog.FileName;
                    txtPDF.Text = PDFFile;
                }
            }
        }

        private void btnDonustur_Click(object sender, EventArgs e)
        {
            ProcessStartInfo processInfo = new ProcessStartInfo();
            processInfo.FileName = Environment.CurrentDirectory + "\\Inkscape\\inkscape.exe";
            processInfo.Arguments = String.Format("--without-gui --export-pdf=\"{0}\" \"{1}\"", txtPDF.Text, txtSVG.Text);
            processInfo.WindowStyle = ProcessWindowStyle.Hidden;

            Process process = Process.Start(processInfo);
            process.WaitForExit();

            MessageBox.Show("Dönüşüm tamamlanmıştır.");
        }
    }
}

Yazdığımız kodda Inkscape’i çalıştırdığımız argümanlar önemlidir. –without-gui Inkscape’in GUI modunda açılmamasını belirttik. –export-pdf parametresi ise PDF dosyanın nereye kaydedileceğini belirtir. Son parametre ise dönüştürülecek SVG dosyasını gösterir.

Uygulamanın kaynak kodlarını indirmek için tıklayınız.

Repository Pattern

Okuma Süresi: 1 dakika

Büyük projeler geliştirirken yaşadığımız en büyük sıkıntı kod tekrarlarıdır. Özellikle iş katmanımızda veritabanına insert, update, delete yaparken birçok tekrar yapmaktayız. Repository pattern bizi bu dertten kurtarmaktadır. Bu yazımızda Entity Framework ile repository pattern’ın nasıl kullanılacağını öğreneceğiz.

İlk önce NuGet Package Manager kullanarak Entity Framework kütüphanesini projemize ekliyoruz.

Entity Framework'ü projeye ekliyoruz.

Daha sonra projemize bir interface ekliyoruz ve aşağıdaki kodları yazıyoruz.

using System;
using System.Linq;
using System.Linq.Expressions;

namespace RepositoryPattern
{
    interface IRepository<T>
    {
        void Insert(T entity);
        void Delete(T entity);
        IQueryable Search(Expression<Func<T, bool>> predicate);
        IQueryable GetAll();
        T GetById(int id);
    }
}

Bu yazdığımız interface yazacağımız repository sınıfımız için bir şablon olacaktır. Oluşturduğumuz interface T tipinde generic nesne tipi almaktadır. Projemize repository kodlarımızı yazacağımız sınıfımız ekleyelim.

using System;
using System.Data.Entity;
using System.Linq;

namespace RepositoryPattern
{
    public class Repository<T> : IRepository<T> where T : class
    {
        DbSet set;

        public Repository(DbContext context)
        {
            set = context.Set<T>();
        }

        public void Insert(T entity)
        {
            set.Add(entity);
        }

        public void Delete(T entity)
        {
            set.Remove(entity);
        }

        public IQueryable Search(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return set.Where(predicate);
        }

        public IQueryable GetAll()
        {
            return set;
        }

        public T GetById(int id)
        {
            return set.Find(id);
        }
    }
}

Repository sınıfımızı IRepository sınıfından türettik ve interface üyelerini implement ettik. Metot gövdelerini de Entity Framework metotlarıyla yazdık. Kodumuzdaki T tipi bir entity tipi temsil etmektedir. Şimdi yazdığımız kodun nasıl kullanıldığını örnek olarak görelim.

using System;

namespace RepositoryPattern
{
 class Program
 {
 static void Main(string[] args)
 {
 Repository<Categories> categories = new Repository<Categories>(new NorthwindEntities());

foreach (Categories item in categories.GetAll())
 {
 Console.WriteLine(item.CategoryName);
 }
 }
 }
}

Kodda gördüğünüz gibi T tipi olarak NortwindEntities altında bulunan Categories tipi verilmiştir. Artık repository nesnemiz Categories tipini kullanarak çalışacaktır. Kodu derleyip çalıştırdığımızda aşağıdaki ekran görüntüsü gelecektir.

SignalR ile Gerçek Zamanlı Web Uygulamaları

Okuma Süresi: 1 dakika

SignalR, WebSocket protokolünü kullanarak gerçek zamanlı uygulamalar geliştirebileceğimiz bir kütüphanedir. Bugün basit bir sohbet uygulaması yapacağız.

Şimdi bir tane ASP.NET projesi açıp Package Manager Console’dan aşağıdaki komutu girerek SignalR için gerekli dosyaları projemize ekleyelim. (Package Manager Console’a ulaşmak için View->Other Windows -> Package Manager Console menüsünü kullanabilirsiniz.)

Install-Package Microsoft.AspNet.SignalR

Projemize bir sınıf ekleyelim ve aşağıdaki kodları yazalım.

public class ChatHub : Hub
    {
        public void SendMessage(string message)
        {
            Clients.All.sendMessage(message);
        }
    }

Burada yazdığımız kodda sisteme bağlı tüm kullanıcılara yazılan mesajı iletiyoruz. Sunucu tarafındaki kodlama bu kadardır. Şimdi istemci tarafında kodlamaya başlıyoruz.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SignalRExample.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="Scripts/jquery-1.6.4.min.js"></script>
    <script type="text/javascript" src="Scripts/jquery.signalR-2.0.2.min.js"></script>
    <script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>
    <script type="text/ecmascript">
        $(function () {
            var chatHub = $.connection.chatHub;

            chatHub.client.receiveMessage = function (message) {
                $(".message").append(message + "<br>");
            };

            function SendMessage() {
                var message = $(".messageText").val();

                if (message != "" && message != null) {
                    chatHub.server.sendMessage(message);
                }
            }

            $(".send").click(function (e) {
                SendMessage();
            });

            $.connection.hub.start();
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <input type="text" class="messageText" /><input type="button" class="send" value="Gönder" />
        <div class="message">
        </div>
    </form>
</body>
</html>

Javascript’te yazdığımız kodları tek tek açıklyalım:

  • var chatHub = $.connection.chatHub; satırı ile Hub sınımıfımızın JavaScript kısmında erişebilmek için yazdık. Sınıfımızın ismi Javascript tarafında camel case olarak yazılmıştır. Eğer pascal case veya başka bir adlandırma istersen sınıfımıza [HubName(“ChatHub”)] şeklinde yazabilirsiniz.
  • chatHub.client.receiveMessage satırı ile sunucu tarafında hub tetiklendiğinde çalışacak olan metotdur. Biz burada tetiklendiğinde div içerisine mesajı yazmaktayız.
  • chatHub.server.sendMessage(message); satırı ile sunucu tarafında bulunan SendMessage metodunu çağırıyoruz.
  • $.connection.hub.start(); satırı ile sayfamız yüklendiğinde hub’ın çalışmasını sağlıyoruz.

Kodumuzu derleyip iki farklı tarayıcı ekranında test edince aşağıdaki gibi bir ekran görüntüsü çıkmaktadır:

SignalR ile gerçek zamanlı web uygulamaları

Örnek projenin kodlarını indirmek için tıklayınız.