суббота, 22 декабря 2012 г.

Выключаю, то чем редко пользуюсь, и записываю, как это включить

Выключить автостарт:
sudo update-rc.d -f apache2 remove
sudo update-rc.d -f mysqld remove

Скрипт для старта:
--------------------------------
#!/bin/sh

/etc/init.d/apache2 start
/etc/init.d/mysqld start
--------------------------------

среда, 12 декабря 2012 г.

Возвращаемся к Python'у и Blender'у

Наконец-то появился прогресс. Правда, увы работа еще не закончена, пока мой скрипт способен выбирать координаты, которые нужны для фрезы. (Тестировался он отдельно.)
Результаты теста можно увидеть на картинке:

Но теперь надо объединить все файлы в одно, и подогнать отступы под Blender (эта противная программа, не хочет, воспринимать, пробелы и знаки табуляции, расставленные в kate (мой любимый текстовый редактор)). Ну и желательно добавить дополнительный анализатор. Который бы просматривал траекторию фрезы, и смотрел нет ли узких мест, где фреза не сможет пройти не задев, соседний контур.
Для анализатора, есть идея использовать следующий метод, создать такой же контур для фрезы, только с условием, что радиус фрезы в два раза больше (т.е. берем диаметр, и искать пересечения, контуров). На словах все просто, а на самом деле, увы нет. Особенно с поиском пересечений контуров (загонять все это в циклы, сразу можно сказать, вешайся, программа итак ими перенасыщена).
А дополнительный обработчик, тут проще, дело в том, что если контур самый внутренний и является отверстием, то при фрезеровании, его, можно накрыть инструмент, по этому, на мой взгляд лучше слой за слоем стачивать материал.
Ну и соответственно последний пункт, сам генератор G/M кодов. Из готовых списков, выбираются координаты и подставляются G/M коды, в зависимости от участка. При переходе от контура к контуру выполняется промежуточная операция: подъем шпинделя, за пределы изделия. Перемещение шпинделя к следующему контуру, ну а дальше опускаем шпиндель и начинаем работать.
Составим список целей, на ближайшее будущее:

  1. Анализатор пересечения контуров
  2. Доводчик (для фрезерования отверстий)
  3. Генератор G/M кодов








пятница, 8 июня 2012 г.

Время сессии, а мысли о станке, Python'e и Blender'е

Смешно, но меня все не покидает мысль, о скорейшей реализации станка и ПО для него, но надо подходить к этому делу с умом. К сожалению, когда читал про станки и детали машин, понял, что в этой жизни мало, что известно человеку. Те же станки создаются на базе уже существующих моделей и рассчитать их невозможно, если только использовать метод конечных элементов, который очень ресурсоёмок. А расчёты передач заключаются в том, чтобы использовать упрощенные формулы с массой инженерных коэффициентов полученных опытным путём.
Что касается ПО, тут тоже свои заморочки. Никак не могу придумать анализатор контуров. Ну то есть то, как будет скрипт определять внешний это контур или внутренний. Думаю осуществить эту штуку с помощью бинарного поиска по оси X или Y. То есть, контуры уже известны, будет произведена дополнительная нарезка. На участке контура, будет произведено исследование на экстремум и если минимум, то контур внутренний нас интересует, иначе внешний. Как будет реализован бинарный поиск и что я вообще имею под ним ввиду? Я имею ввиду следующий алгоритм:

  1. Производится срез по оси X или Y. (Ось выбирается та у которой расстояние между максимальным и минимальным значением меньше, с той целью, чтобы в результате деления было, как можно меньше итераций, под максимальным и минимальным значением имеется ввиду крайние точки контуров)
  2. В результате среза, как обычно получаем список координат.
  3. Находим контуры, которые пересекает данная плоскость среза.
  4. Между двух точек контура (в порядке очереди) проводим исследование на экстремум, для этого:
    1. Находим производную dx/dy или dy/dx
    2. Приравниваем ее нулю.
    3. Смотрим перемену знака в точке экстремума.
    4. В зависимости от пункта (3), сохраняем значение максимум или минимум.
  5. Если максимум контур интересует внешний, иначе внутренний.
  6. Значение внешний или внутренний контур сохраняется. В дальнейшем данный контур дополнительной обработке не подвергается с целью избежания лишних затрат вычислительных ресурсов ЭВМ.
  7. После того, как проанализировали все контуры пересекающие плоскость среза производим поиск необработанных контуров, и определяем их местоположение. Если все контуры имеют координаты меньше/больше, чем координаты предыдущей плоскости среза, то про другую половину локации забываем. Лучше поясню рисунком.
  8. Время поиска будет зависеть от положения контуров.
P.S. Возможно, я буду использовать другой тип поиска плоскостей для среза. Который заключается в следующем.
  1. Для минимизации усилий, будет сделан проход, заранее определяющий, плоскости среза по оси X или Y.
  2. При проходе, будут определяться пересекающиеся проекции контуров. И в качестве мест для среза, будут выбраны участки с максимальным приоритетом, то есть с большим числом пересечений данного участка контурами.
Хотя, если подумать, то второй вариант предполагает массу дополнительных проходов, что может привести к торможению.

Ладно, время подумать над алгоритмом есть, хоть и немного. Буду думать, а реализацией, после сессии займусь.

среда, 11 апреля 2012 г.

Изучение Blender API Часть 3

Подумав по поводу дальнейших действий, пришел к выводу, что модель, мне потребуется делить на части. Я это сделаю, создав функцию Slider:
Входные параметры:
  • Высота среза (координата по оси Z)
Выходные параметры:
  • Матрица координат, по которым поочередно пройдется фреза
Как получим достигнутое:
  1. Создаем списки:
    1. Вершин, которые расположены выше, плоскости среза.
    2. Ребер, которые пересекают, плоскость среза, либо, чтобы нижняя точка лежала на плоскости среза.
    3. Граней, которые пересекают, плоскость среза (они помогут составить список граней, которые в дальнейшем будут разбиты в нужном месте для получения координаты для станка)
    4. Составляем список ребер (listofFaces), имеющий следующий формат:
      [[2, 4], [4, 6], [6, 7], [2, 7]] где каждая пара внутренних квадратных скобок отвечают за грань, а цифры внутри, ребра входящие в состав.
    5. Данный двумерный список необходимо рассортировать, так, чтобы он себя представлял следующий вид:
      [[2, 4], [4, 6], [6, 7], [7, 2]]
  2. Составляем список ребер для разбиения, имеющий следующий формат
    [1 2 3 4 1 5 6 7 8 5]
    Цифра, которая повторяется означает конец контура. Фреза выводится за пределы заготовки и в холостом ходе переходит к обработке следующего контура.
  3. После получения списка, считываем число повторений и заносим в счетчик контуров.
  4. Создаем список, содержащий по отдельному списку, для каждого контура, имеющий следующий формат: [[1 2 3 4 1] [5 6 7 8 5]]
  5. Создается список координат [X, Y], в результате прохода через все ребра контура, следующего формата:
    [[[X1 Y1] [X2 Y2] [X3 Y3] [X4 Y4] [X1 Y1]] [[X5 Y5] [X6 Y6] [X7 Y7] [X8 Y8] [X5 Y5]]]
  6. Благодаря дальнейшему анализу координат, определяем зоны внутри, и зоны снаружи.
  7. (Данный пункт добавлен) Необходимо провести анализ, внешний это контур или нет.
  8. Создаем внешние контуры (по ним будет двигаться фреза, и данные контуры будут построены на расстоянии равном половине диаметра фрезы).
  9. Производим анализ, внешних контуров, если они пересекаются, выдать предупреждение, на усмотрение пользователя. (Данное предупреждение означает, что фреза не может пройти по заданной траектории без порчи, первоначальной затеи фрезеровщика)
Алгоритм был изменен и первичный алгоритм, канул в лета, так как начал, писать код в голову пришел другой алгоритм, который я считаю более оптимальным.
На данный момент, почти выполнил первый пункт, просто поленился его доделать.
***
В результате очередного тестирования скрипта выявились, проблемы, функция slider исправно сортирует список (пункт 1.4), но неисправно составляет, список listofFaces при условии, что в сцене несколько объектов.
Однако, если на сцене один объект (производим операцию boolean union). Даже для объектов находящихся в разных местах. Скрипт правильно выполнит поставленную перед ним задачу.
Такое объединение объектов в один считается изначально заданным. Так как у разных объектов может совпадать нумерация вершин, граней и фасок.
***
На данный момент 13.04.2012 пункт 1 полностью выполнен.
***
15.04.2012 Добрая половина уже сделана, но в дальнейшем, самым сложным является анализ зон. К сожалению, пока скрипт не оптимизирован. Но в дальнейшем после, того, как доведу работу до конца, планирую, оптимизировать выполнение скрипта. На данный момент, он содержит, слишком большое количество циклов.
***
18.04.2012 К сожалению, учеба отнимает сильно много времени, и у нас еще как назло конференции. Но от них есть и плюсы. Так из всех докладчиков меня интересовал лишь один доклад, то вовремя остальных докладов, я писал свой алгоритм и теперь осталось только создание внешнего контура. И анализ, на наличие пересечений. Два пункта, но самые сложные на мой взгляд в плане программной реализации.
***
В тот же день заметил, еще одну неурядицу, лучше нарисую ее.
Черной линией я нарисовал внешние контуры, красной линией внутренний.
То есть может быть потребуется начертить именно внутренний контур, а не внешний! Следовательно, перед пунктом 7 необходим, дополнительный пункт 7'. Который бы определял, внешний это контур или внутренний.
***
30.04.2012 Долго мучился с созданием внешнего/внутреннего контуров
В итоге выяснил, что на предыдущих этапах происходит плохая обработка данных, потому что на вход для испытаний мне попали данные с повторными элементами, что не соответствует заданному формату. Поэтому поставлю дополнительный фильтр, для чистки от повторных элементов.
Теперь осталось только научить, свой постпроцессор анализировать. Под анализом в данном случае, я имею ввиду умение определять по какому контуру должна идти фреза, дабы не нарушить замысел моделиста. И умение определять подойдет ли диаметр фрезы или нет. Фреза может оказаться сильно большой, и не сможет отработать заданную траекторию.
Основные задачи на ближайшее будущее:
  1. Написать фильтр значений, дабы формат входных параметров соответствовал требуемому формату.
  2. Написать анализатор вложенности контуров.
  3. Написать анализатор наличия пересечений.

    воскресенье, 8 апреля 2012 г.

    Изучение Blender API Часть 2

    Когда я писал прошлую, статью, ко мне в голову пришла одна гениальная мысль. Которую я почти сразу оформил в виде скрипта на Python. Данный скрипт выводит мне координаты вращения в углах Эйлера, местоположение объекта, данные о его масштабировании и соответственно сами координаты. Теперь вспомним намеченный план из прошлой статьи:

    1. Получить информацию об углах поворота объекта
    2. С учетом углов поворота, изменить координаты точек
    3. Получить информацию о масштабе, данной фигуры
    4. С учетом масштаба, увеличить/уменьшить координаты.
    5. Получить данные о положении объекта
    6. Все полученные на предыдущих шагах координаты переместить в место их реального положения (слава богу все координаты объекта изначально указаны относительно, геометрического, а может и просто программного центра фигуры, главное, что центра!)
    Т.е. пункты 1, 3  и 5 выполнены. Необходимо приступить к пункту 2. С учетом углов поворота, изменить координаты точек.
    Напишем алгоритм преобразования:
    1. Определить под каким углом расположен вектор из начала координат (в нашем случае он совпадает с центром фигуры) до вершины.
    2. Вычислить длину, этого вектора с учетом заданного поворота.
    3. Прибавить угол вращения
    4. Вычислить новые координаты.
    Главное не забывать, что в программировании также, как в механике используется радианная мера углов. 
    Рассмотрим преобразования для оси X, для этого потребуется рисунок:
    Зеленая стрелка это ось Y, синяя стрелка ось Z.
    1. Соответственно для оси X длина вектора от начала координат, до точки равна: modul = sqrt(Y^2+Z^2).
    2. Угол поворота определяем с помощью функции phiX = atan2(Z,Y).
    3. Далее к phiX прибавляем нужный угол поворота. phiX = phiX + angelX.
    4. Вычисляем новые координаты newY = modul*cos(phiX); newZ = modul*sin(phiX);
    Теперь рассмотрим преобразования для оси Y:
    Красная стрелка это ось X, синяя стрелка ось Z.
    1. Соответственно для оси Y длина вектора от начала координат, до точки равна: modul = sqrt(X^2+Z^2).
    2. Угол поворота определяем с помощью функции phiY = atan2(X,Z).
    3. Далее к phiX прибавляем нужный угол поворота. phiY = phiY + angelY.
    4. Вычисляем новые координаты newX = modul*sin(phiY); newZ = modul*cos(phiY);
    Ну и остался угол для последней оси Z:
    Зеленая стрелка ось Y, красная ось X
    1. Соответственно для оси Z длина вектора от начала координат, до точки равна: modul = sqrt(X^2+Y^2).
    2. Угол поворота определяем с помощью функции phiZ = atan2(Y,X).
    3. Далее к phiX прибавляем нужный угол поворота. phiZ = phiZ + angelZ.
    4. Вычисляем новые координаты newX = modul*cos(phiZ); newY = modul*sin(phiZ);
    Теперь дело за проверкой, ведь согласитесь, я мог и ошибиться в понимании углов Эйлера.
    Программу протестировал в самом Blender'е скрипт оказался вполне исправно работающим и как итог мое понимание оказалось верным. То как я тестировал скрипт описывать не буду. Скрипт тестировал отдельно для каждой оси.
    Теперь пора перейти к шагу 4. С учетом масштаба, увеличить/уменьшить координаты.
    Здесь все просто.

    1. x = x*scaleX
    2. y = y*scaleY
    3. z = z*scaleZ
    Ну и как итог, последний шаг все полученные на предыдущих шагах координаты переместить в место их реального положения:
    1. x = x + locationX
    2. y = y + locationY
    3. z = z + locationZ
    Ну вот и все, скрипт, который правильно выводит координаты для фигур написан. Следующая задача, написать скрипт, который все эти координаты преобразует в G/M коды, пускай даже по началу без особых оптимизаций (в конце концов я только учусь). Но это уже в следующем посте.

    понедельник, 2 апреля 2012 г.

    Изучение Blender API. Часть 1.

    Введение

    В предыдущем сообщении, я поставил перед собой цели. Одной из которых является изучение Blender API, чтобы вывести координаты каждой точки 3D модели во внешний текстовый файл.
    В своем изучении Blender API я не соблюдал никаких последовательностей, возможно в этом моя ошибка. В этой теме хочу по пунктам изучить Blender API.
    Начнем с нуля, или как на официальном сайте Blender осуществим быстрый старт.
    Blender/Python API позволяет:
    • Редактировать любые данные пользовательского интерфейса
    • Изменять настройки пользователя, раскладки и темы
    • Запускать инструменты со своими настройками
    • Создавать элементы пользовательского интерфейса, такие как меню, заголовки и панели.
    • Создавать новые инструменты
    • Создавать интерактивные инструменты
    • Создавать новые движки для рендеринга, которые будут совместимы с Blender
    • Создавать новые настройки для имеющихся в Blender данных
    • Рисовать 3D изображения используя команды OpenGL

    Ключевые концепции

    Перед началом любых действий лучше сразу импортировать библиотек Blender API с помощью команды:
    >>> import bpy

    Доступ к данным

    Доступ к данным, может быть получен, прямо из консоли Python. Данная операция осуществляется с помощью модуля bpy.data. Он дает доступ к библиотеке данных. Рассмотрим пример:
    >>> bpy.data.objects
    <bpy_collection[3], BlendDataObjects>
    
    >>> bpy.data.scenes
    <bpy_collection[1], BlendDataScenes>
    
    >>> bpy.data.materials
    <bpy_collection[1], BlendDataMaterials>

    О коллекциях

    Вы наверняка заметили, что индекс, также как в строке, может быть использован для доступа к членам коллекции.
    Для доступа к членам коллекции используется два метода, но надо учитывать, что индекс может быть изменен при очередном запуске Blender.
    >>> list(bpy.data.objects)
    [bpy.data.objects["Camera"], bpy.data.objects["Cube"], bpy.data.objects["Lamp"]]
    
    >>> bpy.data.objects['Cube']
    bpy.data.objects["Cube"]
    
    >>> bpy.data.objects[1]
    bpy.data.objects["Cube"]

    Доступ к аттрибутам

    Создав блоки данных, такие как материалы, объекты, группы и др. необходимо изменить их свойства, используя интерфейс пользователя. Эти же возможности доступны и с помощью Blender API.
    >>> bpy.data.objects[0].name'Camera'
    
    >>> bpy.data.scenes["Scene"]
    bpy.data.scenes["Scene"]
    
    >>> bpy.data.materials.new("MyMaterial")
    bpy.data.materials["MyMaterial"]
    Для проверки, что данные доступны, и могут использоваться из консоли воспользуемся следующим примером:
    >>> bpy.data.scenes[0].render.resolution_percentage
    50
    
    >>> bpy.data.scenes[0].objects["Cube"].data.vertices[0].co.x
    1.0
    Казалось, бы вот он ответ, на мучающий меня вопрос, но увы не тут то было. Координаты, которые получаем при выводе таким методом, скажем так, весьма относительны. Почему? Потому, что те координаты, что он дает, это координаты при условии, что моделька, один к одному, да и при всем при этом не масштабирована, не повернута, в разных направлениях и ее центр совпадает с центром начала координат.
    Как с этим бороться?
    1. Получить информацию об углах поворота объекта
    2. С учетом углов поворота, изменить координаты точек
    3. Получить информацию о масштабе, данной фигуры
    4. С учетом масштаба, увеличить/уменьшить координаты.
    5. Получить данные о положении объекта
    6. Все полученные на предыдущих шагах координаты переместить в место их реального положения (слава богу все координаты объекта изначально указаны относительно, геометрического, а может и просто программного центра фигуры, главное, что центра!)
    Из этого алгоритма, на данный момент, я не знаю, как выполнить первый пункт (получение углов вращения). Остальные пункты, по крайней мере все, что связано с Blender'ом я могу выполнить, а то что с ним не связано, могу вывести и написать алгоритм.
    Главное, что я верю, что это реально сделать! И пускай и не сразу, но я сделаю это, ибо у меня есть, тайный стимул, но об этом я расскажу позже.

    Постановка задачи на создание алгоритма постпроцессора для преобразования 3D модели в G/M коды


    Введение

    Требуется создать программу, для работы со станками ЧПУ при использовании СПО. Данный проект будет являться свободным аналогом ArtCAM работающим под ОС Linux.

    Что такое ArtCAM?

    ArtCAM Pro - программный пакет для пространственного моделирования/механообработки, который позволяет автоматически генерировать пространственные модели из плоского рисунка и получать по ним изделия на станках с ЧПУ. ArtCAM Pro предлагает мощный, легкий в использовании набор средств моделирования, который предоставляет дизайнеру свободу при создании сложных пространственных рельефов.

    Техническое задание

    Необходимо:

    • Создать постпроцессор для переработки 3D моделей в редакторе Blender в G/M коды, являющиеся мировым стандартом в станкостроении.
    Возможности постпроцессора:
    • Создание исходного файла с G/М кодами для работы на ЧПУ станке
    • Умение распознавать 3D модели, правильное расположение элементов, и частей будущего изделия
    • Возможность построения 3D модели на базе 2D изображения в форматах BMP, JPG, DXF, SVG
    • Назначение режимов резания для станка в зависимости от материала и размера фрезы (эти параметры будут задаватся в 3D редакторе Blender)
    • Выбор механообработки
      • Черновая
      • Чистовая
    • Определение точности изготовления детали и шероховатости поверхности (с учетом погрешности станка, и неточности в процессе дискретного перемещения инструмента)
    На данный момент программно-техническое обеспечение содержит следующие компоненты:
    • Blender —  свободный пакет для создания трёхмерной компьютерной графики, включающий в себя средства моделирования, анимации, рендеринга, постобработки видео, а также создания интерактивных игр.
    • Blender API(англ. application programming interface, API [эй-пи-ай]) интерфейс прикладного программирования: набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением Blender для использования во внешних программных продуктах.
    • Python (англ. python — питон, произносится [ˈpaɪθ⟨ə⟩n] — па́йтон, также, широко используется русскоязычное произношение пито́н) —высокоуровневый язык программирования общего назначения с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.
    Поэтапные шаги создания данного проекта:
    1. Изучить Blender API, с той целью, чтобы выяснить, как вывести координаты каждой точки 3D модели во внешний текстовый файл.
    2. Разбить полученные координаты по уровням, вдоль оси Z сверху в них в зависимости от требуемой точности изготовления станка.
    3. Описать алгоритм создания G/M кодов, для каждого уровня в отдельности, с использованием всевозможной оптимизации учетом ограничений по механообработке.
    4. Запись полученного алгоритма механообработки в G/M кодах во внешний текстовый файл.

    среда, 15 февраля 2012 г.

    Список литературы по специальности мехатроника

    Нам дали большой список литературы и ведь даже не позаботились, чтобы книги были доступны нам студентам. Как думаете? Это нормально. Вот попробуйте найти следующую литературу в интернете.
    Основы мехатроники:

    1. Подураев Ю.В. Мехатроника: основы, методы, применение изд.2 Уч. пос. для студ. ВУЗов. МАШИНОСТРОЕНИЕ, 2007 г. - 256 с.
    2. Хайманн Б. Мехатроника: Компоненты, методы, примеры / Б. Хайманн, В. Герт, К. Попп, О. Репецкий; под ред. О.В. Репецкого; пер. с нем. А.В. Хапров [и др.]. - Новосибирск: Изд-во СО РАН, 2010. - 602 с.
    3. Введение в мехатронику: Учеб. пособие /А. К. Тугенгольд, И. В. Богуславский, Е. А. Лукьянов и др. Под ред. А. К. Тугенгольда. В 2-х кн. Ростов н/Д: Изд. центр ДГТУ, 2002—2004.
    4. Попов Е.П., Верещагин А.Ф., Зенкевич С.Л. Манипуляционные роботы: динамика и алгоритмы. Главная редакция физико-математической литературы издательства «Наука», М.: 1978.-400 с.
    5. Карнаухов Н.Ф. Электромеханические и мехатронные системы. -Ростов н/Д: Феникс, 2006. 320 с.
    6. Основы робототехники: Н.В. Василенко, КД. Никитин, В.П. Пономарёв, А.Ю. Смолин - Томск МГП "РАСКО", 1983 г. - 470 c.
    7. Matlab & Simulink. Проектирование мехатронных систем на ПК (+ CD-ROM): С. Г. Герман-Галкин — Санкт-Петербург, Корона-Век, 2008 г.- 368 с.
    8. Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений / Пер. с англ. М.: Мир, 1980. 177с.
    9. Каханер Д., Моулер К., Нэш С. Численные методы и математическое обеспечение/ 1998 год. 575 стр
    10. Лазарев Ю.Б. Моделирование процессов и систем в MATLAB. / Ю.Б. Лазарев // СПб:. Питер, 2005, – 512 с.
    11. Черных И. В. SIMULINK: среда создания инженерных приложений. / Под ред. к.т.н. В.Г. Потемкина. М.: ДИАЛОГ-МИФИ, 2003.
    12. Перельмутер,В.,М. Пакеты расширения MATLAB. Control System Toolbox иRobust Control Toolbox / В.М.Перельмутер. - М.: СОЛОН-ПРЕСС, 2008. - 224 с.
    Из выше написанного списка, я нашел 6, 8, 9, 10, 11, 12

    Гидро-пневмо приводы автоматического оборудования:

    1. Богомолов А.И., Михайлов К.А. Гидравлика: Учебник. Изд. 2-е, перераб. и доп. - М.: Стройиздат, 1972. - 648 с.
    2. Лепешкин А.В., Михайлин А.А., Шейпак А.А. Гидравлика гидропневмопривод / Под ред. Шейпака А.А. Ч. 2: Гидравлические машины и гидропневмопривод: учеб. – М.: ГОУ МГИУ, 2007. – 350 с.
    3. Юфин А.П. Гидравлика, гидравлические машины и гидропривод/ Юфин А.П. М.: Высш. школа, 1965. - 427 е.: ил.112
    4. Лепешкин А.В., Михайлин А.А./ Под ред. Беленкова Ю.А. Гидравлические и пневматические системы/ Учебник. М.: изд. “Академия”, 2004. 336 с.
    5. Осипов П.Е. Гидравлика, гидравлические машины и и гидропривод: Уч. Пособие. 3-е изд., перераб. и доп. - М.: Лесная промышленность. 1981. - 424 с.


    четверг, 26 января 2012 г.

    Установка Latex

    Latex вещь довольно удобная, но увы. Пришлось временно использовать Windows для черчения в AutoCAD. Слава богу триал версий скачанных с инета мне хватило. И вот снова вернувшись на Linux забыл, как ставится пакет Latex со всем необходимым, выход нашел :)
    sudo aptitude install texlive-full
    Весит много, но оно того стоит. И теперь моя программа по расчёту курсовых по электротехнике, снова работает.