Можно ли прорисовывать блоки в AutoCAD2007 через C#
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Можно ли прорисовывать блоки в AutoCAD2007 через C#

Можно ли прорисовывать блоки в AutoCAD2007 через C#

Ответ
Поиск в этой теме
Непрочитано 19.12.2011, 13:31 #1
Можно ли прорисовывать блоки в AutoCAD2007 через C#
ghost
 
Регистрация: 19.12.2011
Сообщений: 35

Добрый день! Уважаемые участники форума!
Я начинающий программист , хорошо знаю AutoCAD. Хотел узнать, можно ли готовые блоки которые хранятся в *.dwg файле, вставлять и прорисовывать к примеру в ряд, в новом документе AutoCAD ???
И если это возможно, может быть есть у кого нибудь какой нибудь исходник..... или ссылка на инфу об этом!
На сколько знаю Autodesk-ом выпускаются библиотека ObjectARX для С++ в которой я описания подобных манипуляций не нашел, но я так понял что с AutoCAD можно работать через NET и библиотеки есть в самом AutoCAD-е ,вот только инфы по ним нет.....
Просмотров: 15436
 
Непрочитано 19.12.2011, 14:40
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
На сколько знаю Autodesk-ом выпускаются библиотека ObjectARX для С++ в которой я описания подобных манипуляций не нашел, но я так понял что с AutoCAD можно работать через NET и библиотеки есть в самом AutoCAD-е ,вот только инфы по ним нет.....
тынц.
Цитата:
Хотел узнать, можно ли готовые блоки которые хранятся в *.dwg файле, вставлять и прорисовывать к примеру в ряд, в новом документе AutoCAD ???
можно. Программно импортируешь определение блока, затем создаёшь его вхождение.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 19.12.2011, 14:48
#3
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Все это делается элементарно
Если вставляется чертеж как блок, можешь использовать
такую команду (правда код на VB.NET,но легко транслировать на C#)
Код:
[Выделить все]
<CommandMethod("IBB", CommandFlags.Session And CommandFlags.Redraw)> _
    Public Sub test()
        Dim DwgNm As String = "c:\abc.dwg"
        Dim blkNm As String = "abc"
        Dim insPt As New Point3d(300.0, 300.0, 0.0)
        'Dim s3d As New Scale3d(2)
        'Dim rot As Double = Math.pi/4
        Dim AcDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = AcDoc.Database
        InsertDrawingAsBlock(AcDoc, DwgNm, blkNm, insPt)
    End Sub
    Public Sub InsertDrawingAsBlock(ByVal doc As Document, ByVal filepath As String, ByVal blockname As String, ByVal ipt As Point3d)
        Dim curdb As Database = doc.Database
        Dim ed As Editor = doc.Editor
        Dim loc As DocumentLock = doc.LockDocument()
        Using loc
            Dim tr As Transaction = doc.TransactionManager.StartTransaction
            Using tr
                Try
                    Dim blkid As ObjectId
                    Dim bt As BlockTable = CType(tr.GetObject(curdb.BlockTableId, OpenMode.ForRead, False), BlockTable)
                    If bt.Has(blockname) Then
                        Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(String.Format("Block ""{0}"" does already exist" & vbLf & "Try another name", blockname))
                        Return
                    End If
                    Dim btr As BlockTableRecord = CType(tr.GetObject(curdb.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
                    Dim db As Database = New Database(False, True)
                    Using db
                        db.ReadDwgFile(filepath, System.IO.FileShare.Read, False, "")
                        blkid = curdb.Insert(blockname, db, True)
                    End Using
                    If (Not bt.Has(blockname)) Then
                        Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(String.Format("Block ""{0}"" does not added to block table" & vbLf & "Exit on Error", blockname))
                        Return
                    End If
                    Dim btrec As BlockTableRecord = CType(tr.GetObject(blkid, OpenMode.ForRead, False), BlockTableRecord)
                    If String.IsNullOrEmpty(btrec.Name) Then
                        btrec.UpgradeOpen()
                        btrec.Name = blockname
                        btrec.DowngradeOpen()
                    End If
                    Dim bref As BlockReference = New BlockReference(ipt, blkid)
                    Dim mat As Matrix3d = Matrix3d.Identity
                    bref.TransformBy(mat)
                    bref.ScaleFactors = New Scale3d(2)
                    bref.Rotation = Math.PI / 4
                    btr.AppendEntity(bref)
                    tr.AddNewlyCreatedDBObject(bref, True)
 
                    If btrec.HasAttributeDefinitions Then
                        Dim atcoll As Autodesk.AutoCAD.DatabaseServices.AttributeCollection = bref.AttributeCollection
                        For Each subid As ObjectId In btrec
                            Dim ent As Entity = DirectCast(subid.GetObject(OpenMode.ForRead), Entity)
                            Dim attDef As AttributeDefinition = TryCast(ent, AttributeDefinition)
                            If attDef IsNot Nothing Then
                                ed.WriteMessage(vbLf & "Value: " + attDef.TextString)
                                Dim attRef As New AttributeReference()
                                attRef.SetPropertiesFrom(attDef)
                                attRef.Visible = attDef.Visible
                                attRef.SetAttributeFromBlock(attDef, bref.BlockTransform)
                                attRef.HorizontalMode = attDef.HorizontalMode
                                attRef.VerticalMode = attDef.VerticalMode
                                attRef.Rotation = attDef.Rotation
                                attRef.TextStyle = attDef.TextStyle
                                attRef.Position = attDef.Position + ipt.GetAsVector()
                                attRef.Tag = attDef.Tag
                                attRef.FieldLength = attDef.FieldLength
                                attRef.TextString = attDef.TextString
                                attRef.AdjustAlignment(curdb)
                                atcoll.AppendAttribute(attRef)
                                tr.AddNewlyCreatedDBObject(attRef, True)
                            End If
                        Next
                    End If
                    ed.UpdateScreen()
                    tr.Commit()
                Catch ex As Autodesk.AutoCAD.Runtime.Exception
                    Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.ToString & vbCr & ex.Message)
                End Try
            End Using
        End Using
    End Sub
Если блок вставляешь из коллекции блоков другого документа
используй для его чтения методы ReadDwgFile
и метод WBlockCloneObjects для импорта нужных блоков
Смотри на болоте
http://www.theswamp.org/index.php?board=27.0
и у Кина Волмслея
http://through-the-interface.typepad.com/

Вот пример на скорую руку того что тебе нужно
Документ источник должен быть активным блоки
копируются из него в новый документ
Измени значения на нужные

Код:
[Выделить все]
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Windows
Imports System.Windows.Forms
Imports Autodesk.AutoCAD.Internal
--------------------------------------------
#Region "Wblocking for DWG.RU"
        Public Sub CreateEmptyDwg(ByVal dwgpath As String)
            Try
                Dim db As New Database(True, True)
                db.SaveAs(dwgpath, DwgVersion.Newest)
                db.CloseInput(True)
            Catch ex As System.Exception
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message)
            End Try
        End Sub
        <CommandMethod("ImportBlocksToNewDwg", "ahoy", CommandFlags.Session Or CommandFlags.Modal Or CommandFlags.Redraw)> _
        Public Sub TestMultWBlocking()
            Dim newDwgPath As String = "C:\Test\InsertExample.dwg" '<-- change file path for the newly created document to insert block in
            Dim pts As New Point3dCollection
            pts.Add(New Point3d(0, 0, 0))
            pts.Add(New Point3d(100, 0, 0))
            pts.Add(New Point3d(200, 0, 0))'<-- change insertion points collection here
            Dim blocks As New List(Of String)
            blocks.Add("Block1")
            blocks.Add("Block2")
            blocks.Add("Block3")'<-- change block names collection here
            If pts.Count <> blocks.Count Then
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Number of instances in the both collections is not equal to each other!")
                Return
            End If
            WBlockingExample(newDwgPath, pts, blocks)
        End Sub


        Public Sub WBlockingExample(ByVal dwgpath As String, ByVal pts As Point3dCollection, ByVal blocknames As List(Of String))
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            Dim db As Database = doc.Database

            Dim oidc As New ObjectIdCollection()
            Try
                Using tr As Transaction = db.TransactionManager.StartTransaction()
                    If Not File.Exists(dwgpath) Then
                        CreateEmptyDwg(dwgpath)
                    End If

                    If Not File.Exists(dwgpath) Then
                        Return
                    End If
                    Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
                    Dim btr As BlockTableRecord = TryCast(bt(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForRead), BlockTableRecord)
                    Dim bname As String = String.Empty
                    For i As Integer = 0 To blocknames.Count - 1
                        bname = blocknames(i)
                        If bt.Has(bname) Then
                            Dim blkId As ObjectId = bt(bname)
                            If Not blkId.IsNull Or Not blkId.IsErased Then
                                oidc.Add(blkId)
                            End If
                        End If
                    Next
                    tr.Commit()
                End Using

                Using newdb As New Database

                    newdb.ReadDwgFile(dwgpath, FileOpenMode.OpenForReadAndWriteNoShare, False, "")
                    'Using newdoc.LockDocument()<-- include if working from form
                    Using newtr As Transaction = newdb.TransactionManager.StartTransaction()

                        Dim IDMap As New IdMapping()
                        db.WblockCloneObjects(oidc, newdb.BlockTableId, IDMap, DuplicateRecordCloning.Replace, False)

                        Dim newbt As BlockTable = DirectCast(newtr.GetObject(newdb.BlockTableId, OpenMode.ForRead), BlockTable)
                        Dim newbtr As BlockTableRecord = TryCast(newbt(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite), BlockTableRecord)
                        Dim newbname As String = String.Empty
                        For i As Integer = 0 To blocknames.Count - 1
                            newbname = blocknames(i)
                            If newbt.Has(newbname) Then
                                Dim newblkId As ObjectId = newbt(newbname)
                                If Not newblkId.IsNull Or Not newblkId.IsValid Then
                                    Dim bref As New BlockReference(pts(i), newblkId)
                                    newbtr.AppendEntity(bref)
                                    newtr.AddNewlyCreatedDBObject(bref, True)

                                    Dim newbd As BlockTableRecord = DirectCast(newtr.GetObject(newblkId, OpenMode.ForRead), BlockTableRecord)
                                    If newbd.Annotative = AnnotativeStates.True Then

                                        Dim ocm As ObjectContextManager = db.ObjectContextManager
                                        Dim occ As ObjectContextCollection = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES")
                                        ObjectContexts.AddContext(bref, occ.CurrentContext)
                                    End If
                                    If newbd.HasAttributeDefinitions Then
                                        For Each attId As ObjectId In newbd
                                            Dim ent As Entity = DirectCast(newtr.GetObject(attId, OpenMode.ForRead), Entity)
                                            If TypeOf ent Is AttributeDefinition Then
                                                Dim ad As AttributeDefinition = DirectCast(ent, AttributeDefinition)
                                                Dim ar As New AttributeReference()
                                                ar.SetAttributeFromBlock(ad, bref.BlockTransform)
                                                ar.AdjustAlignment(newdb)
                                                bref.AttributeCollection.AppendAttribute(ar)
                                                newtr.AddNewlyCreatedDBObject(ar, True)
                                            End If
                                        Next
                                    End If
                                End If
                            End If
                        Next
                        newtr.Commit()
                    End Using
                    newdb.SaveAs(dwgpath, DwgVersion.Current) 'A2009 ok
                    'newdb.SaveAs(dwgpath, DwgVersion.Current,Database.SecurityParameters)'<--A2010?
                End Using

            Catch ex As System.Exception
                ed.WriteMessage(ex.ToString() + vbCrLf + ex.StackTrace)
            Finally

            End Try
        End Sub
#End Region

Последний раз редактировалось Олег (jr.), 19.12.2011 в 16:15. Причина: code added
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 20.12.2011, 10:44 Спасибо !!!
#4
ghost


 
Регистрация: 19.12.2011
Сообщений: 35


Спасибо большое за помощь!
Все вроде проясняется ..... "Point3d(0, 0, 0)" - это точка входа!?
P.S. Если можно, прокомментируйте пожалуйста основные части алгоритма второго исходника.....
ghost вне форума  
 
Непрочитано 20.12.2011, 13:42
#5
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Извини ничего объяснять не буду

Тебе нужно сюда:

http://docs.autodesk.com/ACD/2010/EN...icNumber=d0e51

Смотри свойста и методы
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 21.12.2011, 10:36
#6
ghost


 
Регистрация: 19.12.2011
Сообщений: 35


Спасибо! Это как раз то что нужно!
ghost вне форума  
 
Непрочитано 21.12.2011, 12:42
#7
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Не за что,
Успехов
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 11.01.2012, 18:08
#8
ghost


 
Регистрация: 19.12.2011
Сообщений: 35


Добрый день!
Подскажите пожалуйста, как именно прорисовать в пространстве модели блок по определенным координатам..... Не могу разобраться ..... Я понял как скопировать блоки из внешнего файла в базу открытого файла! Теперь не могу прорисовать..... Может есть у кого нибудь исходник на чем нибудь..... Или ткните носом в тех которых уже есть..... Я был бы весьма признателен..... Заранее спасибо!
ghost вне форума  
 
Непрочитано 11.01.2012, 19:33
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
как именно прорисовать в пространстве модели блок по определенным координатам..... Не могу разобраться .....
Долго же ты возишься со своим вопросом.
Цитата:
Сообщение от ghost Посмотреть сообщение
... Или ткните носом в тех которых уже есть...
То о чём спрашиваешь, называется "создание вхождения блока". Тут пример создания определения блока и его вхождения (второе - то, о чём спрашиваешь).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 11.01.2012, 20:07
#10
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от ghost Посмотреть сообщение
Может есть у кого нибудь исходник на чем нибудь.....
Глянь мой набросок здесь
в коде найдешь и создание и вставку
и еще чего полезного:

http://www.acadnetwork.com/topic-147.0.html
Олег (jr.) вне форума  
 
Непрочитано 11.01.2012, 20:27
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Олег (jr.), там регистрация требуется
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.01.2012, 21:04
#12
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Олег (jr.), там регистрация требуется
Алексей, извини, забыл - склероззз...
Код:
[Выделить все]
        #region "Simple numbering suit"
        // simple numbering command
        [CommandMethod("bubnum")]
        public static void CreateBubble()
        {

            string blkname = "bubble";

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;

            Matrix3d ucs = ed.CurrentUserCoordinateSystem;

            using (DocumentLock docloc = doc.LockDocument())
            {
                Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("INSBASE", Point3d.Origin);//optional

                Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("LWDISPLAY", 1);//optional

                try
                {
                    Point3d pt = Point3d.Origin;

                    Transaction tr = db.TransactionManager.StartTransaction();

                    using (tr)
                    {
                        BlockTableRecord currSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

                        BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);

                        BlockTableRecord btr = null;

                        if (!bt.Has(blkname))
                        {
                            db.Clayer = db.LayerZero;

                            btr = new BlockTableRecord();

                            btr.Name = blkname;

                            btr.Origin = pt;

                            btr.BlockScaling = BlockScaling.Uniform;

                            btr.Explodable = false;

                            btr.Comments = "Bubble block for numbering suite";

                            btr.Units = UnitsValue.Inches;

                            bt.UpgradeOpen();

                            bt.Add(btr);

                            bt.DowngradeOpen();

                            Circle circ = new Circle(pt, Vector3d.ZAxis, db.Textsize * 1.5);
                            //1.5
                            circ.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(ColorMethod.ByAci, 0);
                            //0 - byblock 'byblock
                            circ.LinetypeId = db.ContinuousLinetype;

                            circ.LineWeight = LineWeight.LineWeight030;

                            btr.AppendEntity(circ);

                            AttributeDefinition attDef = new AttributeDefinition(pt, "1", "NUMBER", "NUMBER", db.Textstyle);

                            attDef.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(ColorMethod.ByAci, 0);
                            //0 - byblock
                            attDef.LinetypeId = db.ContinuousLinetype;

                            attDef.VerticalMode = TextVerticalMode.TextVerticalMid;

                            attDef.HorizontalMode = TextHorizontalMode.TextCenter;

                            attDef.LockPositionInBlock = true;

                            btr.AppendEntity(attDef);

                            tr.AddNewlyCreatedDBObject(circ, true);

                            tr.AddNewlyCreatedDBObject(attDef, true);

                            tr.AddNewlyCreatedDBObject(btr, true);


                        }
                        else
                        {
                            btr = (BlockTableRecord)tr.GetObject(bt[blkname], OpenMode.ForRead);
                        }

                        int num = 1;

                        PromptPointOptions ppo = new PromptPointOptions("\nPick an Insertion Point: ");

                        ppo.AllowNone = true;

                        PromptPointResult pres = default(PromptPointResult);
                        do
                        {
                            pres = ed.GetPoint(ppo);
                            if (pres.Status != PromptStatus.OK)
                            {
                                break;
                            }
                            else
                            {
                                Point3d ipt = pres.Value.TransformBy(ucs);

                                BlockReference bref = null;

                                bref = new BlockReference(ipt, btr.ObjectId);

                                bref.ScaleFactors = new Scale3d(1, 1, 1);

                                currSpace.AppendEntity(bref);

                                tr.AddNewlyCreatedDBObject(bref, true);

                                AttributeCollection atcoll = bref.AttributeCollection;

                                foreach (ObjectId subid in btr)
                                {
                                    Entity ent = (Entity)subid.GetObject(OpenMode.ForRead);

                                    AttributeDefinition aDef = ent as AttributeDefinition;

                                    if (aDef != null)
                                    {
                                        AttributeReference attRef = new AttributeReference();

                                        attRef.SetAttributeFromBlock(aDef, bref.BlockTransform);

                                        if (attRef.Tag == "NUMBER")
                                        {
                                            attRef.TextString = num.ToString();

                                            num += 1;
                                        }
                                        attRef.AdjustAlignment(db);

                                        atcoll.AppendAttribute(attRef);

                                        attRef.DowngradeOpen();
                                    }

                                }
                                bref.DowngradeOpen();

                                tr.TransactionManager.QueueForGraphicsFlush();

                            }
                        } while (pres.Status == PromptStatus.OK);

                        tr.Commit();
                    }

                }

                catch (System.Exception ex)
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message + "\n" + ex.StackTrace);
                }
                finally
                {
                    //do nothing or display your message here
                    ed.WriteMessage("\nPokey");
                }
            }
        }
        #endregion
Олег (jr.) вне форума  
 
Непрочитано 11.01.2012, 21:17
#13
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Глянь мой набросок здесь
Чем не устроила ссылка на KEAN WALMSLEY? Всё то же самое...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 11.01.2012, 21:44
#14
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811



А меня-то каким боком цитировать?
Я вроде вопросов не задавал...
Олег (jr.) вне форума  
 
Непрочитано 11.01.2012, 21:59
#15
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
А меня-то каким боком цитировать?
Я вроде вопросов не задавал...
Так ты показал идентичный код.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 11.01.2012, 22:05
#16
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от hwd Посмотреть сообщение
Так ты показал идентичный код.
Спасибо за намек - типа стырил у Кина Волмслея...
Олег (jr.) вне форума  
 
Непрочитано 11.01.2012, 22:10
#17
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
типа стырил у Кина Волмслея...
Идентичный - не значит, что "стыренный"(с). Я о том, что оба кода делают одно и то же: создают определение блока и затем его вхождение (я же писал об этом). А поскольку уже есть ссылка, то какой смысл давать ещё одну на идентичный (по характеру содержимого) ресурс? Если автор не поймёт содержимое первой ссылки, то вторая ему так же не поможет...

Ладно, забудь...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 11.01.2012 в 22:16.
hwd вне форума  
 
Непрочитано 12.01.2012, 09:15
#18
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Сколько кода, чтобы всего лишь создать блок и вставить! А если сотни всяких блочков вставлять, с разными масштабами, поворотами, разнотипными атрибутами?

"Месье знают толк в извращениях" (С)
ShaggyDoc вне форума  
 
Непрочитано 12.01.2012, 10:26
#19
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Offtop: Так это еще не весь код - надо еще стандартную "шапку" библиотек подключить...
p.s. но правда от сотни блоков (при правильном подходе) код не более чем на 5 строк вырастет
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.01.2012, 10:50
#20
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Сколько кода, чтобы всего лишь создать блок и вставить! А если сотни всяких блочков вставлять, с разными масштабами, поворотами, разнотипными атрибутами?

"Месье знают толк в извращениях" (С)
Не согласен.
1. Создать блок и настроить различные его параметры (в случае необходимости) - это всегда будет требовать написания некоторого объёма кода.
2. Если имеется определение блока, то просто создать его вхождение - много строк кода не займёт. А вот если потребуется не просто создать вхождение, но и выполнить некоторую инициализацию атрибутов, настроить некоторые свойства - тут так же придётся писать соответствующий код.

При желании указанный код можно написать более компактно, но всё равно это не будет 2-3 строчки.

Может конечно в Lisp'е это и проще/короче делается, прописывая все параметры сразу в виде списка, но ведь C# это не Lisp

Цитата:
Так это еще не весь код - надо еще стандартную "шапку" библиотек подключить...
Оно того стоит.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 12.01.2012 в 10:58.
hwd вне форума  
 
Непрочитано 12.01.2012, 11:20
#21
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от hwd Посмотреть сообщение
Может конечно в Lisp'е это и проще/короче делается, прописывая все параметры сразу в виде списка, но ведь C# это не Lisp
Да тут беда не в С# (в AutoLispe например задать все параметры списком, можно только при создании через DXF - а через DXF далеко не все примитивы разумно создавать, через ActiveX все параметры все равно надо так-же прописывать "врукопашную"), в F# например, тоже можно задать все параметры (мутабельные свойства объекта) сразу при создании, беда в .NetAcad что требуется описывать много "дополнительных" (по отношению к лиспу, либо-же объектной модели) действий - что в общем расширяет возможности - но существенно прибавляет кода - а именно транзакции, открытия для записи, создание объектов точка (Point3D)... Вот например официальная документация - снизу "свернутый" пример на VBA - он в 3 раза короче, а если на конкретно этот пример еще и лиспом написать - еще меньше будет.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.01.2012, 11:24
#22
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Лично для меня читабельность важнее краткости, поэтому данное обстоятельство меня не смущает. Кроме того, в .Net-коде можно управлять транзакцией (код увеличивается в том числе и из-за этого, но оно того стоит), а в VBA, насколько я вижу - нет. VBA в AutoCAD мне чем-то напомнил VBA в MS Access (чёрный ящик).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 12.01.2012, 11:36
#23
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


То hwd - а Вы лисп читать умеете? Вопрос серьезный - ибо с моей точки зрения (хоть он действительно и непривычный) формат лиспа один из самых читабельных - чего точно не скажешь про любой диалект С (про конкурсы не читаемости, либо "спрятанности" пасхального яйца в коде на С я думаю Вы знаете).
з.ы. любой лисп код можно автоматически сделать читаемым в смыле отсупов и фрагментов кода.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.01.2012, 11:48
#24
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Может конечно в Lisp'е это и проще/короче делается, прописывая все параметры сразу в виде списка,
Не "может", а точно. Проще и короче во много раз. И не "это не будет 2-3 строчки", а будет одна строчка.
И не "все сразу в виде списка", а как удобнее - и по отдельности, и списком.

И можно функцию с аргументами выполнять любым способом - хоть из командной строки, хоть из меню, хоть из внешних файлов. Заодно в виде аргументов можно и символьное имя какой-то другой функции передать.

Цитата:
но ведь C# это не Lisp
То-то и оно. Это гораздо хуже для таких задач. Хотя, конечно, в каких-то случаях (не столь их много), конечно надо .NET использовать (коль ничего лучше не дали). Но вам "соверен" сказал - а вассалы бросились исполнять. Он и VBA уже давал.

А ну-ка, сделайте функцию или команду для множественной вставки любого блока, которой передается имя блока, масштабы вставки и, факультативно, угол поворота.

1. Во время процесса вставки до указания точки изображение блока висит на курсоре в отмасштабированном виде.

2. После указания точки - визуальный (или клавиатурный) поворот.

3. Блок может иметь (а может не иметь) атрибуты любых типов.

4. Вставка (с висящим блоком) запрашивается, пока не будет пустой ввод или нажатие ESC.

5. И работать должно в любой системе координат.

6. Да чтобы можно было в меню записать.

Цитата:
Оно того стоит
Вот и посмотрим, чего "оно" стоит. И хто оно такое.
ShaggyDoc вне форума  
 
Непрочитано 12.01.2012, 11:58
#25
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
То hwd - а Вы лисп читать умеете? Вопрос серьезный - ибо с моей точки зрения (хоть он действительно и непривычный) формат лиспа один из самых читабельных - чего точно не скажешь про любой диалект С
Пожалуй я не правильно выразился...
Простые вещи читать могу, в рамках функций AutoLisp, которые ещё помню. А поскольку помню я не так уж и много (например тот же VisualLisp я вовсе не знаю), то... Мне привычней синтаксис Си, чем Лиспа. Вполне допускаю, что для кого-то лисп более читабелен (имхо - это зависит от того, какие языки знает программер). Если бы я знал лисп, то наверняка его лаконичность мне была бы более понятной и предпочтительной.
Цитата:
Но вам "соверен" сказал - а вассалы бросились исполнять. Он и VBA уже давал.
я писал на C# задолго до того, как стал использовать его в программировании под автокад. Если бы .Net API не было, я бы писал в автокаде на чём-то другом (скорее всего на лиспе). Не хочу раздувать холивар аля "лисп или дотнет".
Цитата:
Вот и посмотрим, чего "оно" стоит. И хто оно такое.
На C# я не привязан к AutoCAD и всё то, что может лисп - я смогу сделать на дотнете (поправьте, если ошибаюсь). Так что "оно" того стоит (имхо). К примеру: вы из лиспа с подшивками сможете работать (спрашиваю, потому как на самом деле не знаю ответа)?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 12.01.2012 в 12:07.
hwd вне форума  
 
Непрочитано 12.01.2012, 12:02
#26
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


ShaggyDoc - Сейчас Вам на C# _insert вызовут - и скажут ГОТОВО - а потом еще и ссылку найдут - и скажут - а ведь у Вас же то-же самое.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.01.2012, 12:12
#27
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
ShaggyDoc - Сейчас Вам на C# _insert вызовут - и скажут ГОТОВО - а потом еще и ссылку найдут - и скажут - а ведь у Вас же то-же самое.
Я так понял, что Дима_ видит существенную разницу (по смыслу содержимого) между кодом Волмслея и кодом Олега... Иначе этой фразы бы не было... Либо действительно считает что "_insert" это "то же самое" (с) - должен огорчить, что не разделяю этого мнения (т.е. это не то же самое).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 12.01.2012, 12:20
#28
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Я не смотрел коды, но про _insert естественно написал как шутку. Просто как-то была большая тема где ShaggyDoc утверждал что подобное можно реализовать только командными методами - а я там исполнял без них. Про ссылки в предыдущем посте я имел в виду ссылку ShaggyDoc'а.
p.s. она кстати
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 12.01.2012 в 12:33.
Дима_ вне форума  
 
Непрочитано 12.01.2012, 12:49
#29
Сергей Богатов


 
Регистрация: 21.02.2009
Сообщений: 825


Offtop:
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А ну-ка, сделайте функцию или команду для множественной вставки любого блока, которой передается имя блока, масштабы вставки и, факультативно, угол поворота.
1. Во время процесса вставки до указания точки изображение блока висит на курсоре в отмасштабированном виде.
2. После указания точки - визуальный (или клавиатурный) поворот.
3. Блок может иметь (а может не иметь) атрибуты любых типов.
4. Вставка (с висящим блоком) запрашивается, пока не будет пустой ввод или нажатие ESC.
5. И работать должно в любой системе координат.
6. Да чтобы можно было в меню записать.
Это конечно оффтопик и уже обсуждалось, но симметричный вопрос:
А ну-ка, сделайте функцию или команду в LISPe чтоб можно было общаться с подшивкой
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Непрочитано 12.01.2012, 13:00
#30
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Если кому интересно мое резюме по поводу AutoLisp\.Net - то общий ответ такой - лисп хороший, простой, хорошо совместимый, нетребовательный и удобный инструмент - но Autodesk на него положил - так что, если хотите остаться "на плаву" изучайте .Net.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.01.2012, 13:22
#31
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
ShaggyDoc утверждал что подобное можно реализовать только командными методами - а я там исполнял без них
Скажем так - пытался исполнять, отбросив невыполнимые и неинтересные тебе условия. А это незачет. И очень усложнив (ради доказательства прынцыпа) код. Хотя как этюд получилось очень интересно. Но не для "боевого" применения.

Цитата:
А ну-ка, сделайте функцию или команду в LISPe чтоб можно было общаться с подшивкой
А зачем с ней общаться? Что, намек на то, что в объектной модели нет (я не знаю)?

Подшивки - хороший инструмент для интерактивной работы пользователя. Для этого и сделан, а не для программирования. Если понадобится такой же результат, как от применения подшивки, я сделаю его другими способами. Более простыми.

Вообще не надо пытаться влезать с программированием в "ручные" средства. Вот, например (ближе к теме) - динамические блоки. Замечательная вещь для обычных пользователей - делать некоторую параметризацию изображений путем установки разных свойств. Т.е. задавая всякие свойства, нажимая кнопочки и прочее. Дает хорошие результаты, недаром тема так популярна. Потом с динамическими блоками начинают работать программисты и начинаются мучения.

А этого просто не надо делать - надо не сами динамические блоки создавать и изменять, а конечный результат - т.е. требуемое изображение, безо всяких лишних движений. А результат можно получить разными способами.
ShaggyDoc вне форума  
 
Непрочитано 12.01.2012, 13:41
#32
Сергей Богатов


 
Регистрация: 21.02.2009
Сообщений: 825


Offtop:
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А зачем с ней общаться?
Это тема другого разговора... Например для того чтоб в её свойства записывать данные которые потом отображаются в поле чертежа. Или "обрабатывать" только те листы, которые привязаны к подшивке. И т.п.
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Непрочитано 12.01.2012, 13:55
#33
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


ShaggyDoc
>>А ну-ка, сделайте функцию или команду для множественной вставки любого блока, которой передается имя блока, масштабы вставки и, факультативно, угол поворота.
>>1. Во время процесса вставки до указания точки изображение блока висит на курсоре в отмасштабированном виде.
>>...
А если еще хочется немодального окошка с параметрами команды во время работы команды?
zamtmn вне форума  
 
Непрочитано 12.01.2012, 14:00
#34
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Скажем так - пытался исполнять, отбросив невыполнимые и неинтересные тебе условия.
Там в коментариях есть сноски - где эти условия прекрасно выполняються - я думаю Вам уж точно понятно как, если мне такая функция понадобиться - я ее сделаю и выложу, а так ради доказательства самому себе - мне не надо (я точно знаю что можно) - ничего невыполнимого из то задачи нет. Хотя код действительно получился геморный - не спорю (в общем я в той теме еще до того писал - что возни с ним много).
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А этого просто не надо делать - надо не сами динамические блоки создавать и изменять,
У меня была конкретная задача (заказ на программу) которая после долгих согласований лучше всего была решенна, в том числе и с использованием динамических блоков (програмным считыванием и модификацией дин. параметров) - более того без них бы она усложнилась многократно (обойтись было-бы можно - но с очень сильным усложнением самого алгоритма).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.01.2012, 14:10
#35
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Подшивки - хороший инструмент для интерактивной работы пользователя. Для этого и сделан, а не для программирования.
Не согласен - с подшивкой нередко требуется работать и программно, например для того, чтобы проверить правильность её структуры, наличие нужных свойств и их заполнение. Либо (к примеру) получение своего рода полного "реестра" всего того, что имеется в проекте (вроде оглавления, в котором перечислены все разделы, листы в их составе, и наименования видов на этих листах) - эта информация может быть записана в doc-файл и прилагаться к архиву проекта при сдаче его в архив организации. Или, др. пример - вам нужно пакетно обработать все листы подшивки (что-то подправить/проверить), а это значит, что вам нужно выбрать только те чертежи, которые содержат такие листы, и среди существующих в них листов выбрать именно те, что включены в состав подшивки.

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Если понадобится такой же результат, как от применения подшивки, я сделаю его другими способами. Более простыми.
Вообще не надо пытаться влезать с программированием в "ручные" средства.
Вычерчивание линий и кружочков - тоже "ручные" средства, однако это вас не смущает.

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Вот, например (ближе к теме) - динамические блоки. Замечательная вещь для обычных пользователей - делать некоторую параметризацию изображений путем установки разных свойств. Т.е. задавая всякие свойства, нажимая кнопочки и прочее. Дает хорошие результаты, недаром тема так популярна. Потом с динамическими блоками начинают работать программисты и начинаются мучения.
Разумеется всё должно быть в меру. Если определения блоков можно предварительно создать вручную и их набор фиксирован, то лучше конечно же вручную их и сделать. А если множество определений блоков должно формироваться на основе каких-то внешних данных, то возможно, что программно это будет выполнить проще (зависит от сложности определения блока). У меня (к счастью) нет потребности программного создания определения блоков.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 12.01.2012, 21:01
#36
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Цитата:
Сколько кода, чтобы всего лишь создать блок и вставить! А если сотни всяких блочков вставлять, с разными масштабами, поворотами, разнотипными атрибутами?
Может я чего не понял, но кто мешает создать собственную библиотеку типа rucadNetLib.dll, где каждый метод каждого класса может быть достаточно сложным (объемистым) внутри, но использование его клиентским кодом будет крайне простым (в одну строчку). Например, пусть там будет в некотором классе метод EntMake(TypedValue[] args), делающий ровно тоже, что и функция entmake из автолиспа. Да, этот метод будет содержать сотню строк кода, но ведь написать-то его надо всего один раз. Принципы программирования никто не отменял: вызовы методов низкого уровня (со всеми транзакциями и прочими нудными подробностями) упаковываются в простые для вызова методы более высокого уровня. А из этих методов высокого уровня формируется служебная библиотека, которая станет неотемлемой частью ваших будущих проектов. Все, как в "САПР на базе...". Даже названия методов для такой .NET-библиотеки можно взять оттуда, сменив только стиль(нотацию). Будет что-то вроде RuGet...()

Последний раз редактировалось Salt, 12.01.2012 в 21:26.
Salt вне форума  
 
Непрочитано 13.01.2012, 11:36
#37
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
но кто мешает создать собственную библиотеку типа rucadNetLib.dll, где каждый метод каждого класса может быть достаточно сложным (объемистым) внутри, но использование его клиентским кодом будет крайне простым
Никто не мешает. Просто, на мой взгляд, не доросли еще AutoCAD-Net-программисты до понимания простых вещей. Да и сколько их - 1.52 штуки. И пока учатся блоки вставлять.

Это же просто - классный профессиональный программист делает библиотеки (с использованием любых их любимых систем), а прикладные (в том числе простые инженеры) их используют. Примером может служить DOSLib. Она была еще во времена Автокад11 (1990 год), переписывалась в разных вариантах. Во всем мире используют.

Давно предлагаю желающим мой диалог XML-меню переделать на .NET. Тут как раз все основания - и визуальность в стиле .NET сделать, и "немодальность", и XML используется. И наглядно доказать, насколько кто быстрее, и что проще дистрибутив NET притащить, чем команду регистрации выполнить. И насколько красивше.

И все могли бы использовать. Все исходники готов дать (или подробное ТЗ), но желающих нет. Догадываюсь, почему.
ShaggyDoc вне форума  
 
Непрочитано 13.01.2012, 12:02
#38
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Давно предлагаю желающим мой диалог XML-меню переделать на .NET.
Ну я пока не слышал - но давайте так - Вы подробно описываете что делает Ваш диалог (такое постфактум ТЗ) - я делаю один-в-один на .Net - выкладываю исходники - но Вы "торжественно клянетесь" - что впредь и везде будуте использовать только его вместо своего (а иначе кому он еще нужен) идет?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.01.2012, 12:52
#39
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


2 Дима_
Я не вижу смысла в велосипедостроении, поскольку уже имеется готовое решение от Майкрософта в виде XAML. Если данные хранить в этом формате, то их визуализация будет происходить автоматом (это же WPF).

имхо
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 13.01.2012, 13:23
#40
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


2 HWD я тоже не вижу смысла в написании на .Net диалога аналогичного ShaggyDoc'овского, просто Мэтр (как я понял) намекает, что на .Net для этого надо быть "семипядным", а мне кажеться что он (диалог естественно) просто никому не нужен, вот я и спросил - нужен ли он ему (реально, а не "а вот напишите мне - а я посмотрю как у Вас это получится"). Про XAML я естественно знаю, но, допускаю что, может быть нужен именно XML (в определенном формате) - можно его в XAML перевести, либо с TreeView c XmlNode связать - вопрос технически простой.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.01.2012, 16:21
#41
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от hwd Посмотреть сообщение
Идентичный - не значит, что "стыренный"(с). Я о том, что оба кода делают одно и то же: создают определение блока и затем его вхождение (я же писал об этом). А поскольку уже есть ссылка, то какой смысл давать ещё одну на идентичный (по характеру содержимого) ресурс? Если автор не поймёт содержимое первой ссылки, то вторая ему так же не поможет...

Ладно, забудь...
Нет уж, уважаемый , не забудем
Но уважение теперь забудем однозначно
(диски могу вернуть)
Олег (jr.) вне форума  
 
Непрочитано 13.01.2012, 16:30
#42
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Нет уж, уважаемый , не забудем
Но уважение теперь забудем однозначно
(диски могу вернуть)
Вообще-то я тебя в плагиате не обвинял... Ну да ладно, поступай как знаешь.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 13.01.2012, 19:53
#43
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
но Вы "торжественно клянетесь" - что впредь и везде будуте использовать только его вместо своего (а иначе кому он еще нужен) идет?
Ну мне-то нахрена он нужен - у меня все есть.
Цитата:
мне кажеться что он (диалог естественно) просто никому не нужен
Вот-вот. Всегда этим и кончается - "мне кажется". Чего мне кажется, не буду писать.
ShaggyDoc вне форума  
 
Непрочитано 13.01.2012, 21:53
#44
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Давно заметил - темы с #, .net и прочей ms символикой в заголовке чаще других вырождаются обмер пиписек... В этой даже обвинения и обиды.
zamtmn вне форума  
 
Непрочитано 14.01.2012, 00:49
#45
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Вот-вот. Всегда этим и кончается - "мне кажется". Чего мне кажется, не буду писать.
Бррр - у Вас диалог есть, другой Вам не нужен (причем даже с изумлением), мне он не нужен, кому-то другому здесь тоже (по крайней мере никто не говорит - ой я тут делаю, что-то и мне б такой диалог) и для чего его делать?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.01.2012, 17:02
#46
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Давно заметил - темы с #, .net и прочей ms символикой в заголовке чаще других вырождаются обмер пиписек... В этой даже обвинения и обиды.
Пролистай несколько таких тем и сделай вывод,
что или кто этому причиной
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 16.01.2012, 12:40
#47
ghost


 
Регистрация: 19.12.2011
Сообщений: 35


Не ожидал что тема вызовет такие "дебаты"..... Извиняюсь!
Я долго разбираюсь с вопросом потому что, эта тема интересна мне, и разбираюсь я для себя, а времени между работами, праздниками и домашними делами категорически мало..... Поэтому редко и появлялся.....
А язык C# выбран потому что я больше всего имел дела с СИ подобными языками! Поэтому мне удобней их читать, структура программ мне всегда понятней и гибкости языка хватает для большинства задач.....
У меня возникла очередная проблема.
Код:
[Выделить все]
 
[CommandMethod("PR")]
        public void blockPrint()
        {
            Document currDwg = Application.DocumentManager.MdiActiveDocument;
            Database currDatabase = currDwg.Database;
            DocumentCollection docManager = Application.DocumentManager;
            //Editor currentEditor = currDwg.Editor;

            using (DocumentLock docLock = currDwg.LockDocument())
            {
                using (Transaction transaction = currDatabase.TransactionManager.StartTransaction())
                {
                    BlockTable blockTable = (BlockTable)transaction.GetObject(currDatabase.BlockTableId, OpenMode.ForRead);
                    BlockTableRecord CurrBTR = transaction.GetObject(blockTable["IBLOCK"], OpenMode.ForRead) as BlockTableRecord;
                    BlockTable blockTableWr = (BlockTable)transaction.GetObject(currDatabase.BlockTableId, OpenMode.ForWrite);
                    ObjectId CurrBlockTableRecordId = blockTable.Add(CurrBTR);
                    BlockTableRecord ms = (BlockTableRecord)transaction.GetObject(blockTableWr[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                    BlockReference br = new BlockReference(Point3d.Origin, CurrBlockTableRecordId);
                    ms.AppendEntity(br);
                    transaction.AddNewlyCreatedDBObject(br, true);
                    transaction.Commit();
                }
            }
        }
Пытаюсь вот таким кодом просто нарисовать блок "IBLOCK" который уже есть в базе документа, в пространстве модели.
После запуска в AutoCADe происходит исключительная ситуация - eDuplicateRecordName
Даже и не знаю с какой стороны начинать копать!?

Вот весь текст:
************** Exception Text **************
Autodesk.AutoCAD.Runtime.Exception: eDuplicateRecordName
at Autodesk.AutoCAD.DatabaseServices.SymbolTable.Add(SymbolTableRecord value)
at pr_block.PRINT.blockPrint() in D:\AutoDS\pr_block\pr_block\PRINT.cs:line 32
at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()

Последний раз редактировалось ghost, 16.01.2012 в 13:58.
ghost вне форума  
 
Непрочитано 16.01.2012, 14:43
#48
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
После запуска в AutoCADe происходит исключительная ситуация - eDuplicateRecordName
Есть уже блок с именем IBLOCK в таблице блоков, а ты пытаешься его повторно добавить.
Александр Ривилис вне форума  
 
Непрочитано 16.01.2012, 21:10
#49
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


А где проверка на существование блока,
плохо смотришь примеры
Код:
[Выделить все]
if (!blockTable.Has("IBLOCK")) //<-- Проверка на существование блока
{
Application.ShowAlertDialog("Блок \"IBLOCK" не существует, выход из программы)) ");
return;// program exiting
}
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 17.01.2012, 10:24
#50
ghost


 
Регистрация: 19.12.2011
Сообщений: 35


Заработало!

Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
А где проверка на существование блока,
плохо смотришь примеры
Учту! И обязательно сделаю проверку..... Просто на первом этапе для меня было важно добиться работоспособности скелета, а теперь я его буду "наращивать"!
И продолжу ковырять отверткой под названием "Net", гранитный монолит AutoCADa.....
Всем большое спасибо!
ghost вне форума  
 
Непрочитано 17.01.2012, 14:00
#51
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от ghost Посмотреть сообщение
Заработало!
Успехов
Олег (jr.) вне форума  
 
Непрочитано 18.01.2012, 19:53
#52
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
Давно предлагаю желающим мой диалог XML-меню переделать на .NET.
Переделаю. Так, как описано здесь. Даже не смотря на то, что Диме_ это не нужно.
Но не скоро: жизнь удавила напрочь, не до .NET'a мне сейчас.
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 18.01.2012 в 22:06.
Pastor вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Можно ли прорисовывать блоки в AutoCAD2007 через C#



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Как можно открыть чертеж через LISP на котором стоит пароль? ivspec LISP 7 10.02.2006 17:36
Можно ли через VBA динамически двигать объекты? {Smirnoff} Программирование 4 11.12.2003 01:14