PDA

View Full Version : استفاده از DLLهای اتوکد در برنامه



شفیعی
دوشنبه 24 بهمن 1390, 06:51 صبح
سلام
چطوری میشه از DLL های اتوکد در سی شارپ استفاده کرد در این زمینه راهنمائی هست من میخواهم یک فایل اتوکد را که در داخل یک بانک SQL ذخیره است در اتوکد لود بکنم و وقتی کاربر فایل را ادیت میکنه برنامه پیغامی نمایش بدهد و پس از بستن اتوکد فایل اتوکد دوباره در بانک ذخیره بشه

Erfanian
دوشنبه 24 بهمن 1390, 11:59 صبح
سلام
از ابزارهای موجود در AutoCAD .NET API استفاده کنید.

شفیعی
دوشنبه 24 بهمن 1390, 13:27 عصر
سلام
چطوری میشه بیشتر توضیح بدهید مثالی در این زمینه هست؟

Erfanian
سه شنبه 25 بهمن 1390, 13:02 عصر
http://docs.autodesk.com/ACD/2011/ENU/filesMDG/WS73099cc142f48755-5c83e7b1120018de8c0-23ab.htm

epsi1on
سه شنبه 25 بهمن 1390, 21:43 عصر
سلام
چطوری میشه از DLL های اتوکد در سی شارپ استفاده کرد در این زمینه راهنمائی هست من میخواهم یک فایل اتوکد را که در داخل یک بانک SQL ذخیره است در اتوکد لود بکنم و وقتی کاربر فایل را ادیت میکنه برنامه پیغامی نمایش بدهد و پس از بستن اتوکد فایل اتوکد دوباره در بانک ذخیره بشه
سلام دوست من.
دوستان راهنمایی کردند (البته من دقیق منظورشون رو متوجه نشدم) ولی به نظر من اول فایل رو از پایگاه داده تبدیل به یک فایل معمولی بکنید (یعنی محتواش رو مثلا در فایل C:\Drawing.dwg بریزید) بعد فایل رو اصطلاحا اجراش کنید (با استفاده از امکانات کلاس System.Diagnostics.Proccess) و البته قبلش با FileSystemWatcher مراقبش بشید که اگر تغییری کرد متوجه بشید. و در آخرهم بعد از تموم شدن کار و بستن اتوکد دوباره بریزینش توی دیتابیس. اینطوری دیگه درگیر آشنایی با APIهای اتوکد هم نمیشید (در ضمن اگر اشتباه نکنم این APIهای دات نت اتوکد از ورژن 2006 اتوکد به بعد وجود دارن و قبل از اون نیستن) و لازم نیست از DLL های اتوکد در C# استفاده کنید.
شایدم من منظور شما و هدفتون رو درست و کامل متوجه نشدم، که اگر اینطوره ممنون میشم بیشتر توضیح بدید...

شفیعی
چهارشنبه 26 بهمن 1390, 08:35 صبح
سلام دوست من.
دوستان راهنمایی کردند (البته من دقیق منظورشون رو متوجه نشدم) ولی به نظر من اول فایل رو از پایگاه داده تبدیل به یک فایل معمولی بکنید (یعنی محتواش رو مثلا در فایل C:\Drawing.dwg بریزید) بعد فایل رو اصطلاحا اجراش کنید (با استفاده از امکانات کلاس System.Diagnostics.Proccess) و البته قبلش با FileSystemWatcher مراقبش بشید که اگر تغییری کرد متوجه بشید. و در آخرهم بعد از تموم شدن کار و بستن اتوکد دوباره بریزینش توی دیتابیس. اینطوری دیگه درگیر آشنایی با APIهای اتوکد هم نمیشید (در ضمن اگر اشتباه نکنم این APIهای دات نت اتوکد از ورژن 2006 اتوکد به بعد وجود دارن و قبل از اون نیستن) و لازم نیست از DLL های اتوکد در C#‎ استفاده کنید.
شایدم من منظور شما و هدفتون رو درست و کامل متوجه نشدم، که اگر اینطوره ممنون میشم بیشتر توضیح بدید...

دوست عزیز خیلی ممنون
من روش شما را انجام دادم فقط چند مشکل هست
1- fileSystemWatcher1 درست کار نمیکنه یا من بلد نیستم من میخواهم وقتی کاربر فایل اتوکد را ویرایش میکند و سپس ذخیره میکند برنامه پیغام بدهد در واقع برنامه من متوجه بشود.
2- اگر بخواهم چند فایل را تحت نظر بگیرم باید چکار بکنم مثلا سه فایل
3- چطوری تشخیص بدهیم اتوکد بسته شده است

private void AutoCad_Click(object sender, EventArgs e)
{
var dbanfal = new LINQDataContext();
int i = dataGridView2.CurrentRow.Index;
string S = dataGridView2.Rows[i].Cells[11].Value.ToString();
if (S != null)
{
//MessageBox.Show(S);
var Autocad = (from T in dbanfal.DWGNaghsheFiles where (T.C_DWGNaghsheFile == int.Parse(S)) select T).Single();
var FileName = (from T in dbanfal.ImageNaghsheFiles where (T.C_ImageNaghsheFile == int.Parse(S)) select T).Single();
saveFileDialog1.FileName = FileName.N_File;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
FileStream fs = File.OpenWrite(saveFileDialog1.FileName);
byte[] fileBinData = new byte[fs.Length];
fileBinData = Autocad.NaghsheFile.ToArray();
fs.Write(fileBinData, 0, fileBinData.Length);
fs.Close();
fileSystemWatcher1.Filter = saveFileDialog1.FileName;
}
Process p = new Process();
p.StartInfo.WorkingDirectory = @"D:\Program Files\AutoCAD 2007\acad.exe";
p.StartInfo.FileName = @"D:\Program Files\AutoCAD 2007\acad.exe";
p.StartInfo.Arguments = saveFileDialog1.FileName;
p.Start();
} // end if (S != null)
}

private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
{
MessageBox.Show("hello");
}

epsi1on
چهارشنبه 26 بهمن 1390, 22:19 عصر
دوست عزیز خیلی ممنون
من روش شما را انجام دادم فقط چند مشکل هست
1- fileSystemWatcher1 درست کار نمیکنه یا من بلد نیستم من میخواهم وقتی کاربر فایل اتوکد را ویرایش میکند و سپس ذخیره میکند برنامه پیغام بدهد در واقع برنامه من متوجه بشود.
2- اگر بخواهم چند فایل را تحت نظر بگیرم باید چکار بکنم مثلا سه فایل
3- چطوری تشخیص بدهیم اتوکد بسته شده است

خواهش میکنم دوست من.
1- برای اینکه متوجه بشید کی فایل Edit میشه همونطور که میدونید باید از رخدادِ Changed ِ نمونه ی FileSystemWatcherتون استفاده کنید. البته قبل از استفاده از نمونه ی ساخته شده باید EnableRaisingEvents (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.enableraisingevents.as px) ش رو true کنید تا فعال بشه.
2- چند تا FileSystemWatcher استفاده کنید :) منظورتون همین بود؟
3- بعد از p.Start(); متد p.WaitForExit رو صدا کنید، تا تا وقتی برنامه تموم نشده خط بعد از این متد اجرا نمیشه و همونجا متوقف میمونه...

شفیعی
یک شنبه 30 بهمن 1390, 07:33 صبح
سلام
دوست عزیز مراحلی را که گفتی انجام دادم بازم جواب نمیدهد
وقتی داخل نرم افزار اتوکد فایل را ذخیره میکنم برنامه پیغامی نمیدهد اصلا متوجه نمیشوددر این زمینه نمونه برنامه داری که بتونم بهتر متوجه بشوم
var Autocad = (from T in dbanfal.DWGNaghsheFiles where (T.C_DWGNaghsheFile == int.Parse(S)) select T).Single();
var FileName = (from T in dbanfal.ImageNaghsheFiles where (T.C_ImageNaghsheFile == int.Parse(S)) select T).Single();
//string AcadFileName = AppDomain.CurrentDomain.BaseDirectory + FileName.N_File+".DWG";
string AcadFileName = "C:\\" + FileName.N_File + ".DWG";
FileStream fs = File.OpenWrite(AcadFileName);
byte[] fileBinData = new byte[fs.Length];
fileBinData = Autocad.NaghsheFile.ToArray();
fs.Write(fileBinData, 0, fileBinData.Length);
fs.Close();
////fileSystemWatcher
//fileSystemWatcher1.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
// | NotifyFilters.FileName | NotifyFilters.DirectoryName;
fileSystemWatcher1.NotifyFilter = NotifyFilters.Size;
fileSystemWatcher1.Filter = AcadFileName;
// Add event handlers.
fileSystemWatcher1.Changed += new FileSystemEventHandler(fileSystemWatcher1_Changed) ;
fileSystemWatcher1.Created += new FileSystemEventHandler(fileSystemWatcher1_Changed) ;
fileSystemWatcher1.Deleted += new FileSystemEventHandler(fileSystemWatcher1_Changed) ;
fileSystemWatcher1.Renamed += new RenamedEventHandler(fileSystemWatcher1_Changed);

// Begin watching.
fileSystemWatcher1.EnableRaisingEvents = true;
////////////////
Process p = new Process();
p.StartInfo.WorkingDirectory = @"D:\Program Files\AutoCAD 2007\acad.exe";
p.StartInfo.FileName = @"D:\Program Files\AutoCAD 2007\acad.exe";
p.StartInfo.Arguments = AcadFileName;
p.Start();
p.WaitForExit();
در ضمن یک سوال دیگه هم داشتم
چطوری میشه تشخیص داد که اتوکد نصب شده است و مسیر آن را بدست آورد.

epsi1on
یک شنبه 30 بهمن 1390, 11:10 صبح
سلام
دوست عزیز مراحلی را که گفتی انجام دادم بازم جواب نمیدهد
وقتی داخل نرم افزار اتوکد فایل را ذخیره میکنم برنامه پیغامی نمیدهد اصلا متوجه نمیشوددر این زمینه نمونه برنامه داری که بتونم بهتر متوجه بشوم

سلام دوست من.
نمیدونم چرا کار نمیکنه (مطمعنا یک جاییش باید کاری انجام بدیم که نمیدیم :) ). دقیقا هم نمیدونم کجاش هست. یک کار دیگه هم میشه انجام داد، اونم اینه که زمان آخرین باری که فایل Modify میشه رو مورد برسی قرار بدید. یعنی بلافاصله بعد از اینکه ساختید فایل رو زمان آخرین Modify رو ازش بردارید و آخر کار هم باز زمان آخرین Modify رو ازش بردارید، بعد ایندو رو مقایسه کنید و اگر دومی از اولی بزرگتر بود (حداقل به اندازه ی قابل ملاحظه ای) متوجه میشید که فایل تغییر کرده.



در ضمن یک سوال دیگه هم داشتم
چطوری میشه تشخیص داد که اتوکد نصب شده است و مسیر آن را بدست آورد.
اگر برای همینکار میخواید آدرس خود فایلِ dwg رو بعنوان فایل اجرایی به p.StartInfo.FileName اختصاص بدید.

شفیعی
یک شنبه 30 بهمن 1390, 11:34 صبح
سلام
خسته نباشید
در مورد مطلب بالا نمونه برنامه دارید که از روی آن بشه به نتیجه رسید
آدرس نرم افزار اتوکد را میخواهم پیدا بکنم از تو ریجیستری میشه پیدا کرد
p.StartInfo.WorkingDirectory = @"D:\Program Files\AutoCAD 2007\acad.exe";
p.StartInfo.FileName = @"D:\Program Files\AutoCAD 2007\acad.exe";

شفیعی
چهارشنبه 10 اسفند 1390, 09:40 صبح
http://www.cadalyst.com/cad/autocad/cad-clinic-autocad-commands-vb-net-5195