css_tidy (сжатие, разжатие, коррекция)

Некоторое время стало интересно делать посимвольные анализаторы кода. Поэтому один из них css_tidy. Может "сжать" файл удалив лишние пробелы или разжать, а также коррекция, когда разжатый файл просто требует подровнять отступы.

Скачать upload.ee, яндекс

мои программы
Вот где было бы реально полезно наладить чистку, так это в файлах g-code. Выглядит это примерно так -


G1 F[#<_pm>] X-2031.536774 Y392.185466 Z16.790000
G2 F[#<_pb>] I6.619531 J-3.397173   X-2028.314416 Y395.407824 Z16.790000
G1 F[#<_pb>] X-2031.536774 Y392.185466 Z16.790000
G3 F[#<_pb>] I3.249227 J-2.687288   X-2032.383353 Y390.499859 Z16.790000
G2 F[#<_pb>] I-3.338977 J-122.384629   X-2028.878167 Y390.353945 Z16.790000
G1 F[#<_pb>] X-2022.275709 Y396.956403 Z16.790000
G1 F[#<_pb>] X-2017.844520 Y396.897464 Z16.790000
G1 F[#<_pb>] X-2024.609010 Y390.132974 Z16.790000
G2 F[#<_pb>] I-7.234980 J-147.493872   X-2020.386678 Y389.865177 Z16.790000
G1 F[#<_pb>] X-2013.413332 Y396.838524 Z16.790000
G2 F[#<_pb>] I0.840357 J-38.002723   X-2009.075186 Y396.686542 Z16.790000
G1 F[#<_pb>] X-2016.215462 Y389.546266 Z16.790000
G2 F[#<_pb>] I-10.791164 J-143.552956   X-2012.094718 Y389.176882 Z16.790000
G1 F[#<_pb>] X-2004.880944 Y396.390656 Z16.790000
G1 F[#<_pb>] X-2000.686702 Y396.094769 Z16.790000
G1 F[#<_pb>] X-2008.017024 Y388.764448 Z16.790000
G2 F[#<_pb>] I-13.497505 J-138.030243   X-2003.981283 Y388.310060 Z16.790000
G1 F[#<_pb>] X-1996.581378 Y395.709966 Z16.790000
G1 F[#<_pb>] X-1992.601665 Y395.199550 Z16.790000
G1 F[#<_pb>] X-1999.986497 Y387.814719 Z16.790000
G1 F[#<_pb>] X-1996.033589 Y387.277499 Z16.790000
G1 F[#<_pb>] X-1988.621953 Y394.689134 Z16.790000
G2 F[#<_pb>] I-3.005211 J-34.573228   X-1984.699876 Y394.121083 Z16.790000
G1 F[#<_pb>] X-1992.131055 Y386.689905 Z16.790000

Суть в том, что в каждой последующей строке нет нужны повторять то, что задано в предыдущей. Т.е. если -
G1 F[#<_pb>] X-1996.033589 Y387.277499 Z16.790000
G1 F[#<_pb>] X-1988.621953 Y394.689134 Z16.790000
G2 F[#<_pb>] I-3.005211 J-34.573228 X-1984.699876 Y394.121083 Z16.790000

то в сокращенном виде это

G1 F[#<_pb>] X-1996.033589 Y387.277499 Z16.790000
X-1988.621953 Y394.689134
G2 I-3.005211 J-34.573228 X-1984.699876 Y394.121083

В случае сотен тысяч, а то и нескольких миллионов строк, это имеет значение. Что-то я в сочиненном срипте силами seed делаю (в основном форматирование отступами, числа заменяю переменными и т.п.), но не это. Скрипт запускаю сразу из Geany, как скрипт команды "сборки проекта".
wau
нескольких миллионов строк
1. Каков размер файла?
2. Покажи скрипт с seed
3. Сколько времени отрабатывает твой скрипт?
Если есть рабочий вариант есть ли смысл что-то менять?
мои программы
Мне приходится разбивать файлы из-за их большого размера. Самый большой был ок 40мб 717тыс строк. Он имел множественные фрагменты вида -


					G1 F[#<_pb>] X-622.862497 Y590.154389 Z3.499990
					G1 F[#<_pb>] X-622.935561 Y588.818813 Z3.499990
					G1 F[#<_pb>] X-623.198658 Y587.812812 Z3.499990
					G1 F[#<_pb>] X-623.679384 Y586.735356 Z3.499990
					G1 F[#<_pb>] X-624.479711 Y585.443588 Z3.499990
					G1 F[#<_pb>] X-626.479525 Y582.818664 Z3.499990
					G1 F[#<_pb>] X-627.357801 Y581.529393 Z3.499990
					G1 F[#<_pb>] X-627.876619 Y580.514495 Z3.499990
					G1 F[#<_pb>] X-628.148521 Y579.677554 Z3.499990
					G1 F[#<_pb>] X-628.261801 Y578.885618 Z3.499990
					G1 F[#<_pb>] X-628.258684 Y577.885728 Z3.499990
					G1 F[#<_pb>] X-628.096605 Y576.555665 Z3.499990
					G1 F[#<_pb>] X-627.720006 Y574.734190 Z3.499990
					G1 F[#<_pb>] X-626.921907 Y571.388056 Z3.499990
					G1 F[#<_pb>] X-626.476054 Y568.948574 Z3.499990
					G1 F[#<_pb>] X-626.297856 Y566.856503 Z3.499990
					G1 F[#<_pb>] X-626.342433 Y565.097140 Z3.499990
					G1 F[#<_pb>] X-626.589909 Y563.435540 Z3.499990
					G1 F[#<_pb>] X-627.048499 Y561.757230 Z3.499990
					G1 F[#<_pb>] X-627.737935 Y559.986826 Z3.499990
					G1 F[#<_pb>] X-628.670632 Y558.105352 Z3.499990
					G1 F[#<_pb>] X-629.881150 Y556.056209 Z3.499990
					G1 F[#<_pb>] X-631.552480 Y553.564972 Z3.499990
					G1 F[#<_pb>] X-635.657686 Y547.919833 Z3.499990
					G1 F[#<_pb>] X-637.408563 Y545.313297 Z3.499990


Конечно, все это ужасное число строк человек, знающий Питон мог бы заменить одной строкой - https://forum.freecad.org/viewtopic.php?t=89684

Скрипт примитивен, обеспечивает мне читаемость кода вставками табуляций, что дает "сворачивание блоков" в vim & geany (без всяких там типа Электрон), а также замену явно заданных "особых значений" на переменные. Скрипт таков -


#!/bin/bash
#корректировка файлов программ для станка
cd ~/linuxcnc/nc_files/текущие/
#одноразовые коррекции, под проект -
sed -i 's/Z19.123456/Z[#<_vr>]/' tmp
sed -i 's/Z19.123457/Z[#<_vr>]/' tmp
sed -i 's/Z10.123456/Z[15 - [#<_td> - #<_glr>]]/' tmp
sed -i 's/Z10.123457/Z[15 - [#<_td> - #<_glr>]]/' tmp
#sed -i 's/Z15.000000/Z[#<_zris>]/' tmp
#sed -i 's/Z10.000000/Z[#<_td> / 2]/' tmp
#sed -i 's/Z15.000000/Z[#3]/' tmp

sed -i 's/(/				(/' tmp
sed -i 's/G/					G/' tmp
sed -i 's/F25.000000/F[#<_pm>]/' tmp
sed -i 's/F16.666670/F[#<_pm>]/' tmp
sed -i 's/F16.666667/F[#<_pm>]/' tmp
sed -i 's/F1500.000000/F[#<_pm>]/' tmp
sed -i 's/F2000.000000/F[#<_pm>]/' tmp
sed -i 's/F50.000000/F[#<_pm>]/' tmp
sed -i 's/G1 F0.000000/ F[#<_pb>]/' tmp
sed -i 's/F0.000000/ /' tmp
sed -i 's/F100.000000/F[#<_pb>]/' tmp
sed -i 's/F2500.000000/F[#<_pb>]/' tmp
sed -i 's/F3000.000000/F[#<_pb>]/' tmp
sed -i 's/F6000.000000/F[#<_pb>]/' tmp
sed -i 's/F6000.000/F[#<_pb>]/' tmp
sed -i 's/F5000.000000/F[#<_pb>]/' tmp
sed -i 's/F4000.000000/F[#<_pb>]/' tmp
sed -i 's/F1000.000000/F[#<_pb>]/' tmp
sed -i 's/F1000.000/F[#<_pb>]/' tmp
sed -i 's/F116.666667/F[#<_pb>]/' tmp
sed -i 's/F66.666667/F[#<_pb>]/' tmp
sed -i 's/F33.333333/F[#<_pb>]/' tmp
sed -i 's/F83.333333/F[#<_pb>]/' tmp

sed -i 's/K0.000000/ /' tmp


Скрипт даже на больших файлах выполняется очень быстро.
G1 F[#<_pb>] X-626.921907 Y571.388056 Z3.499990
из этих данных я понял, что удалив пробелы в начале строк далее идёт всегда "G" далее идет число от 0 до 9, далее F[....] удаляем его по наличию F и квадратных скобок (если число после G повторяется). Далее до конца строки оставляем как есть. То есть запомнить число после G состоящее из одной цифры и по наличию такого же числа удаляем от G до закрывающей квадратной скобки "]". Всё верно?
мои программы
Скажу больше. Точность 6 знаков после запятой явно избыточная, программе, создающей эти строки, даже явно указано - точность до третьего знака. А все равно так. Так что корректное округление тоже существенно снизит вес файла и занимаемое ОЗУ. Вот пробелы\табулции в начале трогать не надо - это для читаемости, структурирования кодов, я их добавляю специально и отдельно. После G всего 4 варианта -
0 - быстрое перемещение
1 - рабочая подача по прямой
2 - рп дугой ЧС
3 - рп дугой прЧС

F (скорость движения) в исходном тексте идет с числами, скобки и переменные, взде, где только возможно - это уже результат работы моего скрипта. Обычно вид F100.000000 и т.п. (мм/сек).

Числа допустимо оборачивать в прямоугольные скобки, внутри которых могут быть вычисления и переменные - это удобно для адаптации программ под конкретные детали заготовок (число, толщина, ширина и пр) и материалы (от этого зависят скорости подча у F и шаг по высоте Z)
Это принтер или ЧПУ станок?
ЧПУ.
wau
ЧПУ.
Это тема интересная! Если учесть что подавляющее число станков работает на модулях Siemens, а там WinCE и никак не linux.
Во "взрослой" промышленности - возможно, и то, думаю, китайское влияние разбавило влияние Сименса. А в других случаях сильно распространено LinuxCNC, опенсорс и пр. Встречается и во "взрослых" решениях, только с другими "мордочками". Но здесь и сейчас мы не о том. Тем не менее, ж-код теоретически стандартизирован. Да, служебные команды тип отступов, смен инструментов и пр. имеют, могут иметь выраженные "фирменно-проприетиарные" отличия, но львиную долю кода представляют собой стандартные команды-указатели "кдуа и как идти с какой скоростью". О них и речь.
 
Зарегистрироваться или войдите чтобы оставить сообщение.