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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вот мучаемся мы тут, десятки плагинов кривых тормозных пишем, а не проще ли в долгосроке с 0 свою среду замутить потихоньку, с экспортом в dwg и dxf?

Вот мучаемся мы тут, десятки плагинов кривых тормозных пишем, а не проще ли в долгосроке с 0 свою среду замутить потихоньку, с экспортом в dwg и dxf?

Ответ
Поиск в этой теме
Непрочитано 03.02.2019, 06:40
Вот мучаемся мы тут, десятки плагинов кривых тормозных пишем, а не проще ли в долгосроке с 0 свою среду замутить потихоньку, с экспортом в dwg и dxf?
Кудахтыч
 
Регистрация: 28.01.2019
Сообщений: 62

Ну шоб ваще всё летало в реальном времени.
Просмотров: 22851
 
Непрочитано 28.02.2019, 11:35
#121
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Кудахтыч Посмотреть сообщение
Ну в любом случае скорее всего Sort и LINQ не смогут одной строкой дать модифицированную специфическую сортировку и всё равно их придётся модифицировать. Например, у меня есть массив координат двумерных координат точек 2Д полилинии и мне нужно перевернуть массив по Х если точки не идут слева направо (он же условный реверс), а также есть массив этих самых полилиний который мне нужно отсортировать по объектам полилиний слева-направо по самой левой точке каждой полилнии по Х, потом сложить отсортированные полилинии в 1 массив. Думаю тут даже Sort и LINQ будут просто в составе очередной функции и одной строчкой не обойтись.
Отличие будут в том, что пропускается этап переписывания готового (и проверенного на миллионах компьютеров по багрепортам) кода фреймворка на VBA)
Сергей812 вне форума  
 
Непрочитано 28.02.2019, 11:59
#122
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Кудахтыч Посмотреть сообщение
Ну в любом случае скорее всего Sort и LINQ не смогут одной строкой дать модифицированную специфическую сортировку и всё равно их придётся модифицировать.
Вы гадаете, т.к. не знаете возможностей LINQ.
LINQ - это библиотека расширяющая стандартный синтаксис языка платформы .NET (VB C# C++ ...) , а Sort - один из возможных методов этого языка.
И по поводу того, что там можно сделать одной строкой... Например вот одна строка из проекта написанного на C# (для удобства выполнены переносы):
Код:
[Выделить все]
 
string dataInStr = (from node in xDoc.Descendants()
   where node.Name.LocalName == "Property"
      let attr = node.Attribute("name")
          where attr != null & attr.Value == "Creation Time"
      let atttr = node.Attribute("category")
          where atttr == null 
   select node.Attribute("value").Value).FirstOrDefault();
Что делает приведенная выше строка:
В XML документе, пройтись по всем нодам, включая ВСЕ вложения (не зависимо от уровня вложенности), с именем "Property", и если у ноды есть атрибут "name" и это атрибут реально есть и его значение равно "Creation Time", то посмотреть, есть ли у этой ноды еще и атрибут "category" и если его нет, то взять у ноды ВСЕ атрибуты с именем "value" и вернуть строковое значение первого элемента в полученном списке. При этом, как видно из синтаксиса, вполне себе можно использовать не строгие равенства, фильтровать и сортировать как угодно.

Это просто пример. Решение этой же задачи средствами обычного процедурного языка - использование циклов, рекурсий, пересоздания множества объектов и прочие прелести.

Резюмируя, к сожалению, Вы не вполне знаете то, о чем пишите.

Последний раз редактировалось Boxa, 28.02.2019 в 12:08.
Boxa вне форума  
 
Автор темы   Непрочитано 28.02.2019, 12:09
#123
Кудахтыч


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


Цитата:
Сообщение от trir Посмотреть сообщение
их фишка как раз в том, что могут
Ну допустим они мне отсортируют объекты и точки, а как туда условия запихнуть?
Кудахтыч вне форума  
 
Непрочитано 28.02.2019, 12:17
#124
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Boxa Посмотреть сообщение
Решение этой же задачи средствами обычного процедурного языка - использование циклов, рекурсий, пересоздания множества объектов и прочие прелести.
Здесь тоже будет присутствовать, но скрыто будет под конструкциями LINQ)

А если так мило сердцу именно сортировка, то простейший вариант (при оси X по горизонтали слева направо):
Цитата:
Сообщение от Кудахтыч Посмотреть сообщение
а также есть массив этих самых полилиний который мне нужно отсортировать по объектам полилиний слева-направо по самой левой точке каждой полилнии по Х, потом сложить отсортированные полилинии в 1 массив.
Задаем вспомогательную структуру:
Код:
[Выделить все]
/// <summary>
        /// Вспомогательная структура
        /// </summary>
        private struct AuxItemList: IComparable<AuxItemList>
        {
            /// <summary>
            /// Полилиния
            /// </summary>
            public Polyline PL;
            /// <summary>
            /// Самая левая координата вершины полинии в МСК
            /// </summary>
            public double LeftVertex;

            /// <summary>
            /// Базовый конструктор структуры
            /// </summary>
            /// <param name="aPL"></param>
            public AuxItemList(Polyline aPL)
            {
                // Запоминаем полининию
                PL = aPL;
                // Задаем максимально возможное значение левой координаты
                LeftVertex = double.MaxValue;
                // В цикле находим самую левую вершину
                for (int i = 0; i < PL.NumberOfVertices; i++)
                    LeftVertex = Math.Min(LeftVertex, PL.GetPoint3dAt(i).X);
            }

            /// <summary>
            /// Реализация компаратора по умолчанию
            /// </summary>
            /// <param name="other">Другая сравниваемая структура</param>
            /// <returns>Результат сравнения</returns>
            public int CompareTo(AuxItemList other)
            {
                return LeftVertex.CompareTo(other.LeftVertex);
            }
        }
Создаем в коде сам список:
Код:
[Выделить все]
List<AuxItemList> lList = new List<AuxItemList>();
И заполняем его в цикле:
Код:
[Выделить все]
for (...)
{
    lList.Add(new AuxItemList(% Полилиния %));
}
И сортируем по вершине, получая необходимый список:
Код:
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.02.2019, 12:25
#125
Кудахтыч


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Вы гадаете, т.к. не знаете возможностей LINQ.
LINQ - это библиотека расширяющая стандартный синтаксис языка платформы .NET (VB C# C++ ...) , а Sort - один из возможных методов этого языка.
И по поводу того, что там можно сделать одной строкой... Например вот одна строка из проекта написанного на C# (для удобства выполнены переносы):
Код:
[Выделить все]
 
string dataInStr = (from node in xDoc.Descendants()
   where node.Name.LocalName == "Property"
      let attr = node.Attribute("name")
          where attr != null & attr.Value == "Creation Time"
      let atttr = node.Attribute("category")
          where atttr == null 
   select node.Attribute("value").Value).FirstOrDefault();
Что делает приведенная выше строка:
В XML документе, пройтись по всем нодам, включая ВСЕ вложения (не зависимо от уровня вложенности), с именем "Property", и если у ноды есть атрибут "name" и это атрибут реально есть и его значение равно "Creation Time", то посмотреть, есть ли у этой ноды еще и атрибут "category" и если его нет, то взять у ноды ВСЕ атрибуты с именем "value" и вернуть строковое значение первого элемента в полученном списке. При этом, как видно из синтаксиса, вполне себе можно использовать не строгие равенства, фильтровать и сортировать как угодно.

Это просто пример. Решение этой же задачи средствами обычного процедурного языка - использование циклов, рекурсий, пересоздания множества объектов и прочие прелести.

Резюмируя, к сожалению, Вы не вполне знаете то, о чем пишите.
Конешь я не знаю возможности LINQ, но судя по вашему посту экономия сомнительная, какая мне разница буду я условие в фильтре написанных кем-то готовых решений прописывать или в фильтре моих решений при помощи условий и общих функций, если логика действий и там и тут будет заложена та же самая.
Конечно лучше использовать готовое решение, тем более если оно работает быстрее, чтобы велосипеды не изобретать, но своё зачастую просто понятней и пока разберешься в существующих решениях иногда быстрее самому написать.

Последний раз редактировалось Кудахтыч, 28.02.2019 в 12:32.
Кудахтыч вне форума  
 
Непрочитано 28.02.2019, 12:27
#126
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
а как туда условия запихнуть?
where <условие>
trir вне форума  
 
Автор темы   Непрочитано 28.02.2019, 12:40
#127
Кудахтыч


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Здесь тоже будет присутствовать, но скрыто будет под конструкциями LINQ)

А если так мило сердцу именно сортировка, то простейший вариант (при оси X по горизонтали слева направо):


Задаем вспомогательную структуру:
Код:
[Выделить все]
/// <summary>
        /// Вспомогательная структура
        /// </summary>
        private struct AuxItemList: IComparable<AuxItemList>
        {
            /// <summary>
            /// Полилиния
            /// </summary>
            public Polyline PL;
            /// <summary>
            /// Самая левая координата вершины полинии в МСК
            /// </summary>
            public double LeftVertex;

            /// <summary>
            /// Базовый конструктор структуры
            /// </summary>
            /// <param name="aPL"></param>
            public AuxItemList(Polyline aPL)
            {
                // Запоминаем полининию
                PL = aPL;
                // Задаем максимально возможное значение левой координаты
                LeftVertex = double.MaxValue;
                // В цикле находим самую левую вершину
                for (int i = 0; i < PL.NumberOfVertices; i++)
                    LeftVertex = Math.Min(LeftVertex, PL.GetPoint3dAt(i).X);
            }

            /// <summary>
            /// Реализация компаратора по умолчанию
            /// </summary>
            /// <param name="other">Другая сравниваемая структура</param>
            /// <returns>Результат сравнения</returns>
            public int CompareTo(AuxItemList other)
            {
                return LeftVertex.CompareTo(other.LeftVertex);
            }
        }
Создаем в коде сам список:
Код:
[Выделить все]
List<AuxItemList> lList = new List<AuxItemList>();
И заполняем его в цикле:
Код:
[Выделить все]
for (...)
{
    lList.Add(new AuxItemList(% Полилиния %));
}
И сортируем по вершине, получая необходимый список:
Код:
Опять таки в вашем примере сомнительная экономия времени и строк кода для сортировки массива объектов полилиний по самой левой точке ординаты Х, у меня вышло так на ВБ:
Код:
[Выделить все]
  ReDim ssobjs(0 To SelSetPoly.Count - 1) As AcadEntity
  ReDim PolyPointX1(SelSetPoly.Count)
    For i = 0 To SelSetPoly.Count - 1
     Set APolyline = SelSetPoly.Item(i)
     PolyPoint = APolyline.Coordinates
     PolyPointX1(i + 1) = PolyPoint(0)
    Next i

    ReDim IshodnMassIndSort(SelSetPoly.Count)
IshodnMassIndSort = SortMetodSliyanInd(PolyPointX1)

    For i = 1 To SelSetPoly.Count
        Set ssobjs(i - 1) = SelSetPoly.Item(IshodnMassIndSort(i) - 1)
    Next i
Единственное что ваш пример может работать быстрее, т.к. использует доступ к коллекциям, а не циклы по свойствам.

Последний раз редактировалось Кудахтыч, 28.02.2019 в 12:46.
Кудахтыч вне форума  
 
Непрочитано 28.02.2019, 12:46
#128
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


а сколько у тебя кода в SortMetodSliyanInd?
trir вне форума  
 
Непрочитано 28.02.2019, 12:48
#129
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


А функция
Цитата:
Сообщение от Кудахтыч Посмотреть сообщение
SortMetodSliyanInd
Еще сколько занимает?)

А учитывая, что скорость написания кода даже в бесплатных студия раза в 2..3 раза быстрее, чем в VBA, и многое есть в готовом виде во фреймворке (если читать справку, конечно, а не "трудолюбиво" самим половину функций писать)...

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Кудахтыч Посмотреть сообщение
Единственное что ваш пример может работать быстрее, т.к. использует доступ к коллекциям, а не циклы по свойствам.
Мой пример будет работать быстрее, потому что это .Net. На VBA скорость работы кода зависит даже от длины названий переменных и функций в коде, как как интерпретатор)
Сергей812 вне форума  
 
Непрочитано 28.02.2019, 12:50
#130
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
и многое есть в готовом виде во фреймворке
а на git hub'е ещё болше
trir вне форума  
 
Непрочитано 28.02.2019, 12:56
#131
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Сергей812, При всем моем уважении, но всю портянку кода можно было заменить на одну строчку...
Код:
[Выделить все]
 
                var minimumX = (from q in Enumerable.Range(0, pl.NumberOfVertices - 1) select pl.GetPoint3dAt(q).X).Min(); //Тут будет лежать мин X
                var listOrderX = (from q in Enumerable.Range(0, pl.NumberOfVertices - 1) select pl.GetPoint3dAt(q).X).OrderBy(q=>q); //тут все X, отсортированные по возрастанию
                var pointOrderByX = (from q in Enumerable.Range(0, pl.NumberOfVertices - 1) select pl.GetPoint3dAt(q)).OrderBy(q=>q.X).ToList<Point3d>(); //Тут все точки отсортированные по возрастанию Х
И да, я прекрасно понимаю во что превратит этот код компилятор, но мне то какое до этого дело, мне достаточно такого уровня абстракции.

Кудахтыч, я ВАС услышал. "Я знаю как работать с лопатой, поэтому лопата - лучший инструмент. Все можно сделать лопатой, не надо нам трактора, он ломается, лопата - надежность и гибкость." Больше пояснений не требуется.
Boxa вне форума  
 
Непрочитано 28.02.2019, 13:00
#132
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Boxa Посмотреть сообщение
но всю портянку кода можно было заменить на одну строчку...
Можно, поэтому и написал
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А если так мило сердцу именно сортировка
Врятли у ТС возникнут хоть какие то ассоциации между кодом VBA и конструкциями LINQ)
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.02.2019, 13:10
#133
Кудахтыч


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А функция

Еще сколько занимает?)

А учитывая, что скорость написания кода даже в бесплатных студия раза в 2..3 раза быстрее, чем в VBA, и многое есть в готовом виде во фреймворке (если читать справку, конечно, а не "трудолюбиво" самим половину функций писать)...

----- добавлено через ~2 мин. -----

Мой пример будет работать быстрее, потому что это .Net. На VBA скорость работы кода зависит даже от длины названий переменных и функций в коде, как как интерпретатор)
Сама функция SortMetodSliyanInd занимает ровно столько сколько сортировка методом слияния, только SortMetodSliyanInd выдает на выходе не сортированный массив чисел, а массив индексов отсортированного массива:
Код:
[Выделить все]
Public Function SortMetodSliyanInd(IshodnMass) 'Массив индексов массива чисел после сортировки методом слияния числел в сторону увеличения слева-направо: Пример: числа до сортировки:1,2;3;2,38;0  индексы до сортировки:1;2;3;4 | числа после сортировки:0;1,2;2,38;3  индексы после сортировки:4;1;3;2
'*************************Метод слияния
UB = UBound(IshodnMass)
ReDim IshodnMassIndSort(UB)
ReDim IshodnMassSort(UB)
ReDim IshodnMass1(UB)

IshodnMass1 = IshodnMass
IshodnMassSort = SortMetodSliyan(IshodnMass)

   For i = 1 To UB
  For j = 1 To UB
 If IshodnMassSort(i) = IshodnMass1(j) Then
IshodnMassIndSort(i) = j
GoTo 1
 End If
  Next j
1:
   Next i
'*************************Метод слияния

SortMetodSliyanInd = IshodnMassIndSort
End Function
Но это общая функция, написанная 1 раз и сохранённая в модуле для функций.

SortMetodSliyan - соответственно функция самой быстрой сортировки методом слияния.

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

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от Boxa Посмотреть сообщение
Сергей812, При всем моем уважении, но всю портянку кода можно было заменить на одну строчку...
Кудахтыч, я ВАС услышал. "Я знаю как работать с лопатой, поэтому лопата - лучший инструмент. Все можно сделать лопатой, не надо нам трактора, он ломается, лопата - надежность и гибкость." Больше пояснений не требуется.
Да пока именно так, что умею то и делаю, потом постепенно перейду на ваши решения, но лучше пока лопатой чем вообще никак, решения то нужны сейчас, ваших знаний у меня нету, копаться в них некогда, а переделать всегда можно успеть.
Кудахтыч вне форума  
 
Непрочитано 28.02.2019, 13:40
#134
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Ну если выкинуть комментарии из моего примера, то там будет меньше 30 строк) А если на LINQ, как показал выше Boxa - VBA грустно смотрит со стороны. Ну это лирика.

А теперь перейдем к более прозаическим вещам с точки зрения быстродействия и затрат. В вашей универсальной функции:
Цитата:
Сообщение от Кудахтыч Посмотреть сообщение
Public Function SortMetodSliyanInd(IshodnMass)
Передается аргумент типа variant. А это дополнительные затраты ресурсов при хранении и обработке каждого значения из массива (приведение типа, распаковка, упаковка).

Что за несколько десятков лет в VBA не смогли сделать обобщенные типы T, как в .Net - печально и предсказуемо. Развитие языка давно остановилось. И пытаться писать на нем универсальные методы - можно, конечно, но смешно при этом говорить о быстродействии.
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.02.2019, 14:09
#135
Кудахтыч


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Ну если выкинуть комментарии из моего примера, то там будет меньше 30 строк) А если на LINQ, как показал выше Boxa - VBA грустно смотрит со стороны. Ну это лирика.

А теперь перейдем к более прозаическим вещам с точки зрения быстродействия и затрат. В вашей универсальной функции:
Передается аргумент типа variant. А это дополнительные затраты ресурсов при хранении и обработке каждого значения из массива (приведение типа, распаковка, упаковка).

Что за несколько десятков лет в VBA не смогли сделать обобщенные типы T, как в .Net - печально и предсказуемо. Развитие языка давно остановилось. И пытаться писать на нем универсальные методы - можно, конечно, но смешно при этом говорить о быстродействии.

Да я знаю что variant самый затратный (Объём выделяемой памяти: 16 байт + 1 байт на каждый символ), но в рамках моих даже самых крупных задач это ничтожные потери
Даже если элементов массива variant будет 10 000 000 штук - чего у меня не было никогда в самых крупных объектах, максимум пару десятков тысяч, не скупимся и возьмем к примеру 128 байт на элемент, итого 10000000*128/2^30 = 1,19ГБ ОЗУ - что не так уж много по сегодняшним меркам, мы ведь не живём в те времена (90-е) когда Билл Гейтс предрекал что 640 килобайт ОЗУ всегда будет достаточно для домашнего компьютера. Сейчас у меня в компе 32Гб ОЗУ, до этого было 64Гб купленные в 2016-м году, когда цены на ОЗУ выросли в 2 раза в 2018-м я просто продал лишние 32Гб из-за ненадобности в 1,5раза дороже чем купил.

Ну вот я хочу поржать немного, доделать начатое, потом на С++, кстати через несколько лет вроде как Автодеск откажется от VBA и заменит его на VB.Net.
Кудахтыч вне форума  
 
Непрочитано 28.02.2019, 14:31
#136
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и обработке каждого значения из массива (приведение типа, распаковка, упаковка).
Так что не только +16 байт на хранение, и постоянное выделение памяти при приведении типов во время работы.

Offtop:
Цитата:
Сообщение от Кудахтыч Посмотреть сообщение
кстати через несколько лет вроде как Автодеск откажется от VBA и заменит его на VB.Net.
Строго на VB.Net? А остальные .Net языки запретят использовать, видимо..)


----- добавлено через ~7 мин. -----
а еще внутри функции выделяете память под три массива типа variant той же размерности, что и входной.
Сергей812 вне форума  
 
Непрочитано 28.02.2019, 16:16
#137
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Offtop: Чего-то читаю я ТС и стих вспоминается с первой строкой: "Вот новая женщина у Николая". Гуглится по ней и очень, очень похоже выходит
__________________
На работе было скучно:shout:
ciril вне форума  
 
Непрочитано 13.03.2019, 06:56
#138
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
Выходец из акселератора Vive X итальянская компания Mindesk сумела выйти на посевной раунд в размере $900 000. Её главный и пока единственный продукт — это платформа автоматизированного многопользовательского проектирования для очков виртуальной реальности.
https://holographica.space/news/mindesk-cad-19689
trir вне форума  
 
Непрочитано 13.03.2019, 13:43
#139
CalcProg


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


Cirily, главное не результат! Главное процесс!
Offtop
Наш Коля подтянут, а Лена упруга
Партийные оба, и любят друг —
друга.
Спать вместе ложатся, в кровати не
бздят
Но видимо, все таки — оба...
CalcProg вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вот мучаемся мы тут, десятки плагинов кривых тормозных пишем, а не проще ли в долгосроке с 0 свою среду замутить потихоньку, с экспортом в dwg и dxf?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19