Autor Zpráva
nethor
Profil
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
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
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
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
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
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
nethor
Profil
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
Alphard:
No jasně psal jsem to asi 20 minut. Výkon jsem neřešil, šlo mi jen o strukturu .DXF

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: