.NET ile AutoCAD Çalıştırma
0

Bu konuda 14 mesaj var

<Not: En alt mesajda sorun çözüldü>

 

Selamlar, 

 

VB.NET ile AutoCAD çalıştırıp bazı işlemler yaptırmak istiyorum. Bunun için COM arayüzündeki bazı nesneleri referans olarak ekledim ama garip bir durum olarak .NET,  COM 'un işini bitirmesini beklemiyor bir sonraki satıra geçiyor. (Yani AutoCAD 'ın yüklenmesini beklemiyor) doğal olarak şurada hata alıyorum eğer timer koymaz isem : 

 

ACAD.Visible = True

 

çünkü hazır değil...

 

Bu konu hakkında fikir verebilecek olan var mı ? Kod aşağıdaki şekilde.

Imports System
Imports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Interop

        Dim path As String = "C:\drawingx.dwg"

        Dim ACAD As New Autodesk.AutoCAD.Interop.AcadApplication

        System.Threading.Thread.Sleep(1000)
        Dim status As Boolean = ACAD.GetAcadState.IsQuiescent        

        Do Until status = True
            System.Threading.Thread.Sleep(1000)
            status = ACAD.GetAcadState.IsQuiescent
        Loop

        ACAD.Visible = True
        ACAD.Application.WindowState = Common.AcWindowState.acMax
        ACAD.ActiveDocument.Close() 'Bu Drawing1.dwg yi kapatır.
        ACAD.Application.Documents.Open(path)

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

Şöyle bir baktım verilen komut bitince tetiklenen olaylar vs.. mevcut, olmaması abes olurdu zaten. Benzer şekilde prosesi bekleme rutinleri de kullanılabilir. Ne kadar olur, iş görür bilemiyorum ama şu iş bitince tetiklenen "event" mevzusuna bir göz atın.

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

AutoCAD in içine LISP yazılarak yapılabiliyor. Kolay bir script dili LISP. aynı zamanda ARX olarak da yazdığınız kodu şifreleyip, kullanıcının kurcalamasını da engelleyebiliyorsunuz. LISP bir kere tanıtıldıktan sonra her açılan autoCAD ile beraber açılışta çalışması sağlanabiliyor.

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

Selamlar tekrar, @ alreadydead : bu çözümün .exe olması lazım. LISP exe olamıyor sanırım hatta yeni .NET API kütüphaneleri bile .exe olamıyor. Plug in şeklinde programın içinden NETLOAD komutu ile çağrılıyorlar. .exe için mutlaka COM Autocad Type Library refere edilmeli. 

 

@onlytnt, bu komutları daha öncede kullanmıştım... AutoCAD hazır olmadan bir sonraki satıra geçmiyordu... Event olayları ile ilgili ACAD.GetAcadState.IsQuiescent şeklinde bir şey denedim ama ilginç bir şekilde bu kodda erken true oluyor yani autocad hazır olmadan önce true oluyor. Başka bir şey bulmam lazım..

 

@skywarrior hocam işte bildiğim .net için iki yöntem var biri .NET API diğer Autocad Type Library (COM) başka nasıl olur hiç fikrim yok malesef.

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

Yok, o şekilde propertyi poll ederek değil, endcommand diye bir event var mesela. Sizin durumunuza uyar mu bilmiyorum, çağrılan komutun işlemesi bitince atadığınız metodu çağırıyor. Bu tip yöntemler kullanmalısınız.

 

Bu arada dökümanı çağırış yönteminiz doğru mu? Şuradaki örnekte döküman yönetimini yapan bir sınıf kullanılmış mesela:

 

http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer%27s%20Guide/index.html?url=WS73099cc142f48755-385a98b0121d1bb015f-300c.htm,topicNumber=d0e7688

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

@onlytnt  bu kodlar .NET API yani .exe içinde kullanılamaz dll yapılır Netload komutu ile AutoCAD içinden çalıştırılabilir.

@thecrow  bir örnek veya kaynak var mı bu konu ile ilgili ? 

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

processler arası veri paylaşımı için https://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile(v=vs.110).aspx

autocadde kendi kontrolünde thread oluşturup kendi message loopunu yapma imkanın varsa (while içinde sürekli win32deki GetMessage'ı çağırma) buraya kendi processinin gui threadinin id'sini ve öbür tarafta autocadde de oluşturduğun threadin id'sini yazarsın. bu idleri kullanarak SendThreadMessage ile birbirine mesaj yollayabilirsin. signalr, named pipes vs büssürü seçenek var. .net interprocess communication die aratırsan bissürü örnek bulursun elimde hazır bişey yok.

Hayalet beğendi

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

Yorumlar için hepinize çok teşekkür ederim basit bir yüntemle çözdüm belki günün birinde birinin işine yarar : 

Imports System
Imports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Interop

        Dim path As String = "C:\Drawingx.dwt"
        Dim ACAD As New Autodesk.AutoCAD.Interop.AcadApplication

        Dim Status As String = "Run"
        Do Until Status = "Stop"
            Try
                ACAD.Visible = True
                Status = "Stop"
            Catch ex As Exception
                'MessageBox.Show(ex.Message)
                System.Threading.Thread.Sleep(500)
            End Try
        Loop

        ACAD.Application.WindowState = Common.AcWindowState.acMax
        ACAD.ActiveDocument.Close()
        ACAD.Application.Documents.Open(path)

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

Bu sorunun tam çözümü bu yukarıdaki kod her zaman çalışmıyor malesef :

 

 

Imports System

Imports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Interop
 
 
Public Class Form1
 
    Private Sub btnLaunchAutoCAD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLaunchAutoCAD.Click
 
        Me.Cursor = Cursors.WaitCursor
 
        Dim path As String = "C:\textchange.dwt"
 
        MessageFilter.Register()
 
        Dim ACAD As Autodesk.AutoCAD.Interop.AcadApplication
        ACAD = New Autodesk.AutoCAD.Interop.AcadApplication
        ACAD.Visible = True
        ACAD.Application.WindowState = Common.AcWindowState.acMax
        ACAD.ActiveDocument.Close()        
        ACAD.Application.Documents.Add(path) 'Opens a .dwt template as DrawingN.dwg
 
        MessageFilter.Revoke()
 
        Me.Cursor = Cursors.Default
        End
 
    End Sub
 
End Class
Imports System.Runtime.InteropServices
' Reference Microsoft Development Environment 8.0 for this class

<ComImport(), Guid("00000016-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)>Public Interface IOleMessageFilter
    <PreserveSig()> Function HandleInComingCall(ByVal dwCallType As Integer, ByVal hTaskCaller As IntPtr, ByVal dwTickCount As Integer,ByVal lpInterfaceInfo As IntPtr) As Integer
    <PreserveSig()> Function RetryRejectedCall(ByVal hTaskCallee As IntPtr, ByVal dwTickCount As Integer,ByVal dwRejectType As Integer) As Integer
    <PreserveSig()> Function MessagePending(ByVal hTaskCallee As IntPtr, ByVal dwTickCount As Integer,ByVal dwPendingType As Integer) As Integer
End Interface

Public Class MessageFilter

    Implements IOleMessageFilter

    <DllImport("Ole32.dll")>Private Shared Function CoRegisterMessageFilter(ByVal newFilter As IOleMessageFilter, ByRef oldFilter As IOleMessageFilter) As Integer

    End Function

Public Shared Sub Register()

    Dim newFilter As IOleMessageFilter = New MessageFilter()
    Dim oldFilter As IOleMessageFilter = Nothing
    CoRegisterMessageFilter(newFilter, oldFilter)

End Sub

Public Shared Sub Revoke()

    Dim oldFilter As IOleMessageFilter = Nothing
    CoRegisterMessageFilter(Nothing, oldFilter)

End Sub

Public Function HandleInComingCall(ByVal dwCallType As Integer, ByVal hTaskCaller As System.IntPtr, ByVal dwTickCount As Integer, ByVal lpInterfaceInfo As System.IntPtr) As Integer Implements IOleMessageFilter.HandleInComingCall

    Return 0

End Function

Public Function MessagePending(ByVal hTaskCallee As System.IntPtr, ByVal dwTickCount As Integer, ByVal dwPendingType As Integer) As Integer Implements IOleMessageFilter.MessagePending

    Return 2

End Function

Public Function RetryRejectedCall(ByVal hTaskCallee As System.IntPtr, ByVal dwTickCount As Integer, ByVal dwRejectType As Integer) As Integer Implements IOleMessageFilter.RetryRejectedCall

    If (dwRejectType = 2) Then
        Return 99
        'Value >=0 and <100: the call is to be retried immediately
        'Value >=100: COM will wait for this many milliseconds and then retry the call
        'Value -1: the call should be canceled. COM the Returns RPC_E_CALL_REJECTED for the original method call
    Else
        Return -1
    End If

End Function

End Class

Bu mesajı paylaş


Bu mesajın linki
Sosyal ağlarda paylaş

Yorum yazmak için üye olun veya giriş yapın

Yorum yazmak için üye olmanız lazım

Üye ol

Üye olun ve sitemizin tüm avantajlarından yararlanın!


Yeni bir hesap oluştur

Giriş yap

Zaten üyemiz misin? O halde giriş yap


Hemen giriş yap
0

  • Bu sayfadaki üyeler   0 üye

    Şu an bu sayfayı görüntüleyen bir üye yok