Autor | Zpráva | ||
---|---|---|---|
nethor Profil |
#1 · Zasláno: 17. 12. 2015, 19:38:16
Zdravím,
neznáte nějaký script pro práci s vektorovým formátem DXF? Jediné, co jsem našel je: PHP DXF Create: Generate CAD files in the AutoCAD DXF format. Potřebuji ale právě opačnou funkci: Vytáhnout dynamicky z hotového DXF potřebnou část a převést na rastrový výstup. |
||
Jzikes Profil |
#2 · Zasláno: 17. 12. 2015, 23:13:51
Zdravím,
obávám se že do PHP na to žádná třída není (aspoň o ni nevím). Vůbec pro AutoCAD je velká podpora v .NET, takže by sis dost práce ulehčil, udělat si nějaký jednoduchý program v .NET, kterým by si si to předpřipravil a pak už to jenom přetahal do PHP.. Nebo potom to přečíst (.DXF jde číst normálně jako textový soubor) a funkce si napsat sám. Byla by to asi dost velká práce, ale podle mě ne nemožná.. Tady by si k tomu potom měl nějaké podklady: www.autodesk.com/techpubs/autocad/acad2000/dxf/general_dxf_file_structure_dxf_aa.htm images.autodesk.com/adsk/files/autocad_2012_pdf_dxf-reference_enu.pdf en.wikipedia.org/wiki/AutoCAD_DXF S pozdravem -jz |
||
nethor Profil |
Napsat tu třídu asi dokážu, ale znamené to nastudovat specifikaci DXF a dost práce navíc s dílčím problémem ve větším projektu.
Navíc má DXF velikost asi 200 MB, takže se ještě musí řešit problém s alokací paměti. Měl jsem jen dojem, že tohle už musel řešit někdo přede mnou, tak jsem nechtěl 'vymýšlet trakař'. |
||
Jzikes Profil |
#4 · Zasláno: 18. 12. 2015, 15:17:09
No podle mě moc lidí v PHP věci ohledně CADu nevyvíjí, když už tak spíše .NET (a když jo asi to jen tak zadarmo nezveřejní), protože tam je přímá podpora z oblasti Autodesku. U toho věřím, že se ta práce ulehčí. Jak už jsem psal, možná by bylo jednoduší napsat nějaký program, který by to přečetl na desktopu, nebo přímo jako doplněk pro AutoCAD. Tam by se vytahaly věci, co jsou třeba a pak už by to nebylo tak náročné -> dle mě by to nebyla až taková práce, protože tam pro to knihovny jsou..
Ale nevím, možná něco takového je. Navíc neznám specifikace projektu, takže možná mluvím úplně od věci.. -jz |
||
abc Profil |
#5 · Zasláno: 18. 12. 2015, 16:39:08
Našel jsem něco na phpclasses.org:
www.phpclasses.org/package/7954-PHP-Generate-CAD-files-in-the-AutoCAD-DXF-format.html |
||
nethor Profil |
#6 · Zasláno: 18. 12. 2015, 21:16:36
Jzikes:
To rozhodně stojí za úvahu. O specifikaci projektu se nemohu moc šířit, ale v tomhle bodě jde o vytažení cca 10 000 různých konstalací z DXF ... a to by se dalo předem zpracovat dávkou a PHP by už jen načítalo hotové rastry. Díky za nasměrování. Připadalo mi jen, že vzhledem k tomu, že DXF je texťák, by nemělo být principielně zpracování přes PHP a Imagick složité. abc: JJ O tom jsem se zmiňoval v úvodním příspěvku. |
||
Jzikes Profil |
#7 · Zasláno: 18. 12. 2015, 21:57:25
nethor:
Teď mi to vrtalo v hlavě, tak jsem si zkusil něco napsat.. V reálu je to asi nepoužitelné, protože tam používám přesné adresy řádků, ale po troše úpravách by to k něčemu možná bylo.. Z CADu jsem si vyhodil .DXF a takto mi to vyhodilo všechny úsečky ve výkresu: <?php // Simple DXF reader // charset header('Content-Type: text/html; charset=utf-8'); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <br /> <?php // open file $file = './pokus.dxf'; // file exists? if (file_exists($file)) { // ok? -> read file $text = file_get_contents($file); // convert to utf-8 from ansi $text = iconv("WINDOWS-1252", "UTF-8", $text); // explode to sections (header, tables etc...) $sections = explode("SECTION", $text); /* DATA */ //$data_header = $sections[1]; // $data_table = $sections[6]; $data_entities = explode(" ", $sections[8]); /* /DATA */ /* BROWSE THE ENTITIES */ foreach ($data_entities as $entity_index => $entity_word) { // detect main points (ENDSEC, HEADER, LINE, etc...) if (substr($entity_word, 0, 1) == "0") { /* LINE */ if (substr($entity_word, 3, 4) == "LINE") { // count index of line points (it's 5 lines under 0 LINE...) $index = $entity_index + 5; // define array "points" $points = array(); /* COUNT POINTS */ for ($i = 0; $i < 6; $i++) { array_push($points, $data_entities[$index]); $index++; } /* /COUNT POINTS */ /* DEFINE POINTS */ // a $a_x = chop(substr($points[0], 4)); $a_y = chop(substr($points[1], 4)); $a_z = chop(substr($points[2], 4)); // b $b_x = chop(substr($points[3], 4)); $b_y = chop(substr($points[4], 4)); $b_z = chop(substr($points[5], 4)); /* /DEFINE POINTS */ /* OUTPUT */ echo "<strong><em>A[</strong>".$a_x.";".$a_y.";".$a_z."<strong>], B[</strong>".$b_x.";".$b_y.";".$b_z."<strong>]</strong></em><br /><br />"; /* /OUTPUT */ } /* /LINE */ } } /* /BROWSE THE ENTITIES */ } else { // undefined file! -> error! echo "Soubor neexistuje!"; } ?> </body> </html> Měl jsem tam tedy trochu problém s formátováním, takže i když jsem to z windows-1252 přehodil do utf-8, tak mi to v hlavičce dělalo problém s diakritikou, ale to je detail.. Snad to k něčemu někomu bude.. -j |
||
Časová prodleva: 10 dní
|
|||
nethor Profil |
#8 · Zasláno: 28. 12. 2015, 18:35:17
Nakonec jsem našel výhodnější - parciální - vstupní formáty takže se podstatně změnšila velikost vstupních dat.
Pro rozparsování jsem si napsal třídu, ale i tak mám problém s rychlostí zpracování a alokací paměti. |
||
Alphard Profil |
Třeba tam je prostor pro optimalizace. Když se dívám na [#7] Jzikes, padne mi hned do oka file_get_contents, kdyby se takto měly načítat soubory mající řádově stovky mega, nebylo by to úplně šťastné.
Když sem dáš svůj kód a příklad vstupu, třeba s tím někdo zkusí něco udělat (mě tyhle věci docela baví, ale nevím, jestli budu mít dost času). |
||
nethor Profil |
Alphard:
Mezitím jsem se o kousek posunul, ale řeším problém s výkonem a pamětí. Na toto téma jsem napsal dotaz zde: Diskuse JPW: Převod XML do pole |
||
Jzikes Profil |
#11 · Zasláno: 29. 12. 2015, 22:13:24
Alphard:
No jasně psal jsem to asi 20 minut. Výkon jsem neřešil, šlo mi jen o strukturu .DXF |
||
Časová prodleva: 8 let
|
0