Jump to content

Почти работающий лисп


Recommended Posts

Добрый день.

 

Роясь в автокадовских лиспах и проверяя их на совместимость с NanoCad 7 8, обнаружил очень полезный лисп, расставляющий выноски с координатами указанных точек по чертежу.

 

В версии 7.0х64 Лисп отрабатывает почти до конца, но ничего не отрисовывает.

 

В версии 8.0х64 выноска отрисовывается, но Nanocad вылетает с неустранимой ошибкой

 

Может есть тут кто умный, разбирающийся в Lispе, кто переделает скрипт?

post-65907-0-88727200-1476964308.png

vinoska.lsp

Edited by ooo.edp
Link to comment
Share on other sites

Добрый день.

Может есть тут кто умный, разбирающийся в Lispе, кто переделает скрипт?

Добрый.

NC 6+ x86 - полёт нормальный, выноску ставит и не вылетает никуда. NC 6+ x64 - ставит и вылетает. Вопрос о багах, наверное.

В смысле я не умный в LISP'е, поэтому только проверка :) Попробуйте отловить момент ошибки - закомментируйте последние строки после _addleader, и запускайте, поочерёдно вводя в код закомментированные строки.

Edited by Kreator
Link to comment
Share on other sites

Добрый день.

 

Согласен, метод "научного тыка" бывает работоспособным и иногда себя оправдывает.

 

Закомментировав некоторые строки добился того, что в 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

Link to comment
Share on other sites

NC 6+ x86 - полёт нормальный, выноску ставит и не вылетает никуда .

а можно узнать(ради научного интереса) что это за выноска, какого типа? Ведь если скрипт "автокадовский" - он чертит некую "автокадовскую" выноску. Но с интерфейса nanoCAD такую выноску создать (насколько я понимаю) нельзя, т.к. в nanoCAD используются свои выноски. По всей вероятности, это выноски из Teiga.dwg"обернутые" доп.функционалом, с кучей "ручек", доп.функций и прочего.

Таким образом, вопрос вероятно можно перефразировать так: реализован ли для LISP вызов API для родных выносок nanoCAD, или реализован вызовов API Teiga для отрисовки выноски?

Edited by Ivanco
  • Like 1
Link to comment
Share on other sites

а можно узнать(ради научного интереса) что это за выноска, какого типа? Ведь если скрипт "автокадовский" - он чертит некую "автокадовскую" выноску. Но с интерфейса 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. В крайнем случае, палочки нарисовать :D Вообще, лисп - это жесть... Проще заново написать на .Net, хоть синтаксис просматривается :)

Link to comment
Share on other sites

Выноска эта в автокаде используется для отображения геодезических координат точек на разбивочном плане. поэтому нет никаких стрелок.

В автокаде получается обычная редактируемая выноска.

Изначальный код взят с сайта geodezist.ru

Эти точки можно и вручную набивать, но на больших объектах это и долго и ошибки проскакивают.

Link to comment
Share on other sites

Эти точки можно и вручную набивать, но на больших объектах это и долго и ошибки проскакивают.

Варианты:

1.В СПДС можно сделать

- не быстро , но ошибок не будет.

2. Ждать когда найдется добрый человек который перепишет/напишет заново скрипт.

3. Заказать где нибудь переделку скрипта. (либо написание заново, если на Lisp невозможно).Как и озвучивали выше.

P.S в Lisp я тоже не разбираюсь, в .net API вроде по выноскам есть методы/свойства.

Edited by Ivanco
Link to comment
Share on other sites

по .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();
  }
 }

  • Like 1
Link to comment
Share on other sites

Ради такого дела поставил Visual Studio. Я конечно чайник-чайник, но покурил форум и мануалы.

Откомпилировал для версий 7х64 и 8х64.

Рисует в NanoCad выноску от точки 0,0,0

позиция полки 1000, 1000, 0

В NanoCad 7x64 выноска не редактируется.

А как реализовать выноску нанокадовскую?

Link to comment
Share on other sites

А как реализовать выноску нанокадовскую?

На 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 by Ivanco
  • Like 1
Link to comment
Share on other sites

Да ,шевелятся выносные линии в 8-ке. Но не до конца там совместимость отработана, случаются глюки и непонятные изменения выносок.

И динамические блоки в 8-ке работают гораздо лучше. Несколько моих динамических блоков, созданных в Автокаде жутко глючили, а в 8-ке нормально заработали. Было неожиданно приятно.

Link to comment
Share on other sites

На 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 by ooo.edp
  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...