#include "fiko/pafta/pafta_dxf.hpp" #include #include #include "fiko/pafta/pafta_kesit.hpp" #include "fiko/pafta/pafta_olcu.hpp" namespace fiko::pafta { namespace { void satirYaz(std::string& o, Vec2d a, Vec2d b, const char* katman) { char buf[160]; std::snprintf(buf, sizeof buf, "0\nLINE\n8\n%s\n10\n%.6g\n20\n%.6g\n11\n%.6g\n21\n%.6g\n", katman, a.x, a.y, b.x, b.y); o += buf; } void metinYaz(std::string& o, Vec2d p, f64 yukseklik, const std::string& metin, const char* katman) { char buf[96]; std::snprintf(buf, sizeof buf, "0\nTEXT\n8\n%s\n10\n%.6g\n20\n%.6g\n40\n%.6g\n1\n", katman, p.x, p.y, yukseklik); o += buf; o += metin; o += '\n'; } } // namespace std::string paftaDxfMetni(const Pafta& p, const std::unordered_map& cizimler) { std::string o; o.reserve(64 * 1024); o += "0\nSECTION\n2\nENTITIES\n"; const SayfaOlcu so = p.olcu(); // Sayfa + çizim alanı çerçevesi (ISO 10mm) — CERCEVE katmanı. const auto kutu = [&](Vec2d a, Vec2d b) { satirYaz(o, {a.x, a.y}, {b.x, a.y}, "CERCEVE"); satirYaz(o, {b.x, a.y}, {b.x, b.y}, "CERCEVE"); satirYaz(o, {b.x, b.y}, {a.x, b.y}, "CERCEVE"); satirYaz(o, {a.x, b.y}, {a.x, a.y}, "CERCEVE"); }; kutu({0, 0}, {so.en, so.boy}); kutu({10, 10}, {so.en - 10, so.boy - 10}); if (p.antet.goster) { kutu({so.en - 10 - p.antet.en, 10}, {so.en - 10, 10 + p.antet.boy}); const std::string satir1 = p.antet.parca.empty() ? p.ad : p.antet.parca; metinYaz(o, {so.en - 10 - p.antet.en + 4, 10 + p.antet.boy - 10}, 5.0, satir1, "CERCEVE"); metinYaz(o, {so.en - 10 - p.antet.en + 4, 14}, 3.5, "Olcek " + p.olcek.metin() + " " + sayfaAdi(p.sayfa), "CERCEVE"); } // Görünümler: polyline'lar görünüm-yerelden sayfa uzayına taşınır. for (const Gorunum& g : p.gorunumler()) { if (!g.goster) continue; const auto it = cizimler.find(g.kimlik); if (it == cizimler.end() || !it->second.gecerli) continue; const GorunumCizim& c = it->second; const auto grupYaz = [&](const std::vector>& gruplar, const char* katman) { for (const auto& pl : gruplar) for (size_t i = 0; i + 1 < pl.size(); ++i) satirYaz(o, {g.konum.x + pl[i].x, g.konum.y + pl[i].y}, {g.konum.x + pl[i + 1].x, g.konum.y + pl[i + 1].y}, katman); }; grupYaz(c.gorunur, "GORUNUR"); if (g.gizliCizgi) grupYaz(c.gizli, "GIZLI"); if (g.kesitMi && g.taramaGoster && !c.kesitKonturlari.empty()) for (const auto& [ta, tb] : taramaUret(c.kesitKonturlari, 45.0, 3.0)) satirYaz(o, {g.konum.x + ta.x, g.konum.y + ta.y}, {g.konum.x + tb.x, g.konum.y + tb.y}, "TARAMA"); if (g.kesitMi) { // kesit çizgisi ANA görünümün üstünde + etiketler if (const Gorunum* ana = p.gorunumBul(g.kesitAnaGorunum)) { satirYaz(o, {ana->konum.x + g.kesitA.x, ana->konum.y + g.kesitA.y}, {ana->konum.x + g.kesitB.x, ana->konum.y + g.kesitB.y}, "OLCU"); metinYaz(o, {ana->konum.x + g.kesitA.x, ana->konum.y + g.kesitA.y + 3}, 3.5, kesitEtiketi(g.kesitHarf), "OLCU"); } metinYaz(o, {g.konum.x - g.boyut.x * 0.5, g.konum.y + g.boyut.y * 0.5 + 4}, 3.5, kesitEtiketi(g.kesitHarf), "OLCU"); } } // Ölçüler: uzantı + ölçü çizgisi + metin (görünüm-yerelden sayfa uzayına). for (const Olcu& olc : p.olculer()) { if (!olc.goster) continue; const Gorunum* sahip = olc.gorunum ? p.gorunumBul(olc.gorunum) : nullptr; const Vec2d tas = sahip ? sahip->konum : Vec2d{0, 0}; const OlcuCizim oc = olcuGeometrisi(olc); if (!oc.gecerli) continue; for (const auto& [a, b] : oc.cizgiler) satirYaz(o, {tas.x + a.x, tas.y + a.y}, {tas.x + b.x, tas.y + b.y}, "OLCU"); metinYaz(o, {tas.x + oc.metinCipa.x, tas.y + oc.metinCipa.y + 1.0}, 3.5, olcuMetni(olc, sahip ? p.etkinOlcek(*sahip) : p.olcek), "OLCU"); } o += "0\nENDSEC\n0\nEOF\n"; return o; } bool paftaDxfKaydet(const Pafta& p, const std::unordered_map& cizimler, const std::string& yol) { const std::string metin = paftaDxfMetni(p, cizimler); std::ofstream f(yol, std::ios::binary | std::ios::trunc); if (!f) return false; f << metin; return (bool)f; } } // namespace fiko::pafta