ooo.edp Posted October 20, 2016 Report Share Posted October 20, 2016 (edited) Добрый день. Роясь в автокадовских лиспах и проверяя их на совместимость с NanoCad 7 8, обнаружил очень полезный лисп, расставляющий выноски с координатами указанных точек по чертежу. В версии 7.0х64 Лисп отрабатывает почти до конца, но ничего не отрисовывает. В версии 8.0х64 выноска отрисовывается, но Nanocad вылетает с неустранимой ошибкой Может есть тут кто умный, разбирающийся в Lispе, кто переделает скрипт? vinoska.lsp Edited October 20, 2016 by ooo.edp Quote Link to comment Share on other sites More sharing options...
Kreator Posted October 20, 2016 Report Share Posted October 20, 2016 (edited) Добрый день. Может есть тут кто умный, разбирающийся в Lispе, кто переделает скрипт? Добрый. NC 6+ x86 - полёт нормальный, выноску ставит и не вылетает никуда. NC 6+ x64 - ставит и вылетает. Вопрос о багах, наверное. В смысле я не умный в LISP'е, поэтому только проверка Попробуйте отловить момент ошибки - закомментируйте последние строки после _addleader, и запускайте, поочерёдно вводя в код закомментированные строки. Edited October 20, 2016 by Kreator Quote Link to comment Share on other sites More sharing options...
ooo.edp Posted October 21, 2016 Author Report Share Posted October 21, 2016 Добрый день. Согласен, метод "научного тыка" бывает работоспособным и иногда себя оправдывает. Закомментировав некоторые строки добился того, что в NanoCad 8х64 выноска все-таки рисуется в виде линии выноски и отдельного многострочного текста. Но только одну выноску. Если же снова ввести команду запуска скрипта, то после указания направления выноски "Работа NanoCad прекращена......" В NanoCad 7х64: XYUCS - XYUCS ошибка: недопустимая функция: 7599.33 - число это похоже всего координата выноски по "Х" Закомментированные строки: ;; (vla-put-insertionpoint ann_obj (vlax-3d-point end-point)) ;; Теперь модицифируем собственно выноску - это было комментарием, просто чтобы не вырезать построчно ;; (vla-put-verticaltextposition lead_obj acOutside) ;; (vla-put-ArrowheadSize lead_obj 0.5) В общем, умный человек все еще востребован, vinoska2.lsp Quote Link to comment Share on other sites More sharing options...
Ivanco Posted October 24, 2016 Report Share Posted October 24, 2016 (edited) NC 6+ x86 - полёт нормальный, выноску ставит и не вылетает никуда . а можно узнать(ради научного интереса) что это за выноска, какого типа? Ведь если скрипт "автокадовский" - он чертит некую "автокадовскую" выноску. Но с интерфейса nanoCAD такую выноску создать (насколько я понимаю) нельзя, т.к. в nanoCAD используются свои выноски. По всей вероятности, это выноски из Teiga.dwg"обернутые" доп.функционалом, с кучей "ручек", доп.функций и прочего. Таким образом, вопрос вероятно можно перефразировать так: реализован ли для LISP вызов API для родных выносок nanoCAD, или реализован вызовов API Teiga для отрисовки выноски? Edited October 24, 2016 by Ivanco 1 Quote Link to comment Share on other sites More sharing options...
Kreator Posted October 24, 2016 Report Share Posted October 24, 2016 а можно узнать(ради научного интереса) что это за выноска, какого типа? Ведь если скрипт "автокадовский" - он чертит некую "автокадовскую" выноску. Но с интерфейса nanoCAD такую выноску создать (насколько я понимаю) нельзя, т.к. в nanoCAD используются свои выноски. По всей вероятности, это выноски из Teiga.dwg"обернутые" доп.функционалом, с кучей "ручек", доп.функций и прочего. Таким образом, вопрос вероятно можно перефразировать так: реализован ли для LISP вызов API для родных выносок nanoCAD, или реализован вызовов API Teiga для отрисовки выноски? А чёрт знает, что это такое Называется "Выноска", ручек всего 2 - точка и начало полки. Никаких стрелок. Причём текст отдельно в виде МТекста с маскировкой. Вероятно, использован какой-то родной автокадовский тип выноски, о коих копий сломано немало в других темах в стиле "почему не поддерживается MLEADER" и т.п. Вероятно, и вылетает по этому поводу. И скорее всего, результат в NC не такой, как в AC - стрелки нет, хотя в коде она добавляется. Есть предположение, что эта выноска реализована криво/не до конца. Оно и понятно - в NC гораздо более весёлые родные выноски, выдранные из СДПС. Но это давний спор. По поводу кода. Я не большой программист, но расставил контрольные точки и выяснил, что код не переживает вызова этой функции: (vla-put-attachmentpoint ann_obj (+ 4 (if (> (car end-point) (car start-point)) ; выноска вправо, точка — влево 0 2) ;_ end of if (if (/= low-string "") ; нижняя строка есть, выр. — по центру 0 3) ;_ end of if ) ;_ end of + ) ;_ end of vla-put-AttachmentPoint Т.е. изменение точки привязки полки. Надо пробовать заменить vla-addleader на что-то более родное для NC. В крайнем случае, палочки нарисовать Вообще, лисп - это жесть... Проще заново написать на .Net, хоть синтаксис просматривается Quote Link to comment Share on other sites More sharing options...
ooo.edp Posted October 26, 2016 Author Report Share Posted October 26, 2016 Выноска эта в автокаде используется для отображения геодезических координат точек на разбивочном плане. поэтому нет никаких стрелок. В автокаде получается обычная редактируемая выноска. Изначальный код взят с сайта geodezist.ru Эти точки можно и вручную набивать, но на больших объектах это и долго и ошибки проскакивают. Quote Link to comment Share on other sites More sharing options...
Ivanco Posted October 26, 2016 Report Share Posted October 26, 2016 (edited) Эти точки можно и вручную набивать, но на больших объектах это и долго и ошибки проскакивают. Варианты: 1.В СПДС можно сделать - не быстро , но ошибок не будет.2. Ждать когда найдется добрый человек который перепишет/напишет заново скрипт. 3. Заказать где нибудь переделку скрипта. (либо написание заново, если на Lisp невозможно).Как и озвучивали выше. P.S в Lisp я тоже не разбираюсь, в .net API вроде по выноскам есть методы/свойства. Edited October 26, 2016 by Ivanco Quote Link to comment Share on other sites More sharing options...
Robink Posted October 26, 2016 Report Share Posted October 26, 2016 по .Net да есть public static void CreateMultiLeader() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = tr.GetObject(db.BlockTableId, 0) as BlockTable; BlockTableRecord ms = tr.GetObject(bt[blockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; var startPt = new Point3d(1000, 1000, 0); var endPt = new Point3d(0, 0, 0); Vector3d v = endPt - startPt; Point3d landPt = startPt + v; MLeader mld = new MLeader(); int ldNum = mld.AddLeader(); int lnNum = mld.AddLeaderLine(ldNum); mld.AddFirstVertex(lnNum, landPt); mld.AddLastVertex(lnNum, startPt); //Create the MText MText mt = new MText(); mt.Contents = "Multileader with"; mld.ContentType = ContentType.MTextContent; mld.MText = mt; mld.TextLocation = startPt; ms.AppendEntity(mld); tr.AddNewlyCreatedDBObject(mld, true); tr.Commit(); } } 1 Quote Link to comment Share on other sites More sharing options...
ooo.edp Posted October 27, 2016 Author Report Share Posted October 27, 2016 Ради такого дела поставил Visual Studio. Я конечно чайник-чайник, но покурил форум и мануалы. Откомпилировал для версий 7х64 и 8х64. Рисует в NanoCad выноску от точки 0,0,0 позиция полки 1000, 1000, 0 В NanoCad 7x64 выноска не редактируется. А как реализовать выноску нанокадовскую? Quote Link to comment Share on other sites More sharing options...
Ivanco Posted October 28, 2016 Report Share Posted October 28, 2016 (edited) А как реализовать выноску нанокадовскую? На MultiCAD.NET однако: using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Globalization; using Multicad.Symbols; using Multicad.DatabaseServices.StandardObjects; using Multicad.DatabaseServices; using Multicad; using Multicad.Geometry; using Multicad.Runtime; namespace pointCoord { public class CoordsToNote { [CommandMethod("ptCoordToNote", CommandFlags.NoCheck | CommandFlags.NoPrefix)] public void pointCoordToLeader() { McObjectId[] idSelecteds = McObjectManager.SelectObjects("Выберите объекты типа _точка_"); if (idSelecteds.Length == 0) { MessageBox.Show("Объекты не выбраны"); return; } List<DbPoint> allPoint = new List<DbPoint>(); foreach (McObjectId oneObj in idSelecteds) { McObject currObj = oneObj.GetObject(); if (currObj is DbPoint) { allPoint.Add(currObj as DbPoint); } else { continue; } } if (allPoint.Count == 0) { MessageBox.Show("Не выбрано ни одной точки"); return; } foreach (DbPoint onePt in allPoint) { McNote note = new McNote(); Point3d p1 = new Point3d(onePt.Position.X, onePt.Position.Y, 0.0); Point3d p2 = new Point3d(onePt.Position.X + 500, onePt.Position.Y + 500, 0.0); note.Origin = p2; McBLSegment segment = note.Leader.AddSegment(p1,note.Origin); string x = onePt.Position.X.ToString("F", CultureInfo.InvariantCulture); note.Items.Add(x); string y = onePt.Position.Y.ToString("F", CultureInfo.InvariantCulture); note.Items.Add(y); note.DbEntity.AddToCurrentDocument(); } } } } 1.Подключить к проекту:System.Windows.Forms.dll,mapibasetypes.dll,mapimgd.dll( у двух последних CopyLocal -False) 2.Скомпилировать под нужную платформу. 3. ptCoordToNote - команда. P.S. упс, движок форума сбивает форматирование кода.. Edited October 28, 2016 by Ivanco 1 Quote Link to comment Share on other sites More sharing options...
Robink Posted October 29, 2016 Report Share Posted October 29, 2016 А в 8 выносные разве не шевелятся? Я сейчас перешел на дин блоки. Quote Link to comment Share on other sites More sharing options...
ooo.edp Posted October 30, 2016 Author Report Share Posted October 30, 2016 Да ,шевелятся выносные линии в 8-ке. Но не до конца там совместимость отработана, случаются глюки и непонятные изменения выносок. И динамические блоки в 8-ке работают гораздо лучше. Несколько моих динамических блоков, созданных в Автокаде жутко глючили, а в 8-ке нормально заработали. Было неожиданно приятно. Quote Link to comment Share on other sites More sharing options...
ooo.edp Posted November 7, 2016 Author Report Share Posted November 7, 2016 (edited) На MultiCAD.NET однако ...Так как меня не устраивал результат программы на мультикаде, то пришлось разбираться самому. Тапками не бейте, я совсем чайник (см. 9 пост) Вот что в итоге получилось: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Multicad.Symbols; using Multicad.DatabaseServices.StandardObjects; using Multicad.DatabaseServices; using Multicad; using Multicad.Geometry; using Multicad.Runtime; using System.Windows.Forms; namespace Vinoska { public class Vinoska { [CommandMethod("ptCoordToNote", CommandFlags.NoCheck | CommandFlags.NoPrefix)] public void pointCoordToLeader() { Point3d pnt1 = new Point3d(); InputJig jig = new InputJig(); InputResult res = jig.GetPoint("Укажите точку выноски:"); pnt1 = res.Point; InputJig jig2 = new InputJig(); InputResult res2 = jig2.GetPoint("Укажите положение полки:"); Point3d pnt2 = new Point3d(); pnt2 = res2.Point; McNote note = new McNote(); note.Origin = pnt2; // Устанавливаем положение полки в точку pnt2 McBLSegment segment = note.Leader.AddSegment(pnt1, note.Origin); string x = pnt1.Y.ToString("F"); //Записываем в выноску значение по y, переводя его в тип String и округляя до 2-х знаков после запятой note.Items.Add(x); string y = pnt1.X.ToString("F"); // То же по x note.Items.Add(y); note.DbEntity.AddToCurrentDocument(); //Отображаем выноску на чертеже } } } Компилировал для NanoCad 8x64 - все работает. Теперь надо разобраться: - как исполнять команду не однократно - как управлять направлением полки выноски (сейчас она все время вправо от начала) - как прикрутить dll на кнопку. Для NanoCad 7x64 не компилирует, ругается на необходимость Net 4.0.0 Прикладываю dll команда запуска ptCoordToNote Vinoska.zip Edited November 8, 2016 by ooo.edp 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.