%38 Скидка
, ,

40×80 Sigma Profil 10 Kanal Ağır Tip

Первоначальная цена составляла 50.68$.Текущая цена: 31.25$.

40×80 Sigma Profil 10 Kanal Ağır Tip ve Teknik Detayları. Ürün Teknik Özellikleri. Malzeme: Yüksek Mukavemetli Eloksallı Alüminyum Alaşım (EN AW-6063 T66). Kesit Boyutları: 40mm x 80mm dikdörtgen kesit, hassas toleranslarla üretilmiştir.

Доступность: 99 в наличии

🔥 Только сегодня %38 Скидочное предложение!📦 Категория: 10-канальные профили Sigma
Ürün hakkında teknik bilgi Teknik ürün bilgisi
Гарантия MermakОт завода до конечного пользователя · импортер / главный дилер · сильный склад
ИмпортерГлавный дилер / дистрибьюторСильный складХорошая ценаКорпоративный счет

В наличии / доступно к заказу · Возврат в течение 14 дней для стандартных неиспользованных товаров; для изделий по размеру/резке условия могут отличаться.

40×80 Sigma Profil 10 Kanal Ağır Tip ve Teknik Detayları

Ürün Teknik Özellikleri

  • Malzeme: Yüksek Mukavemetli Eloksallı Alüminyum Alaşım (EN AW-6063 T66)
  • Kesit Boyutları: 40mm x 80mm dikdörtgen kesit, hassas toleranslarla üretilmiştir.
  • Kanal Genişliği: 10mm T-Kanal sistemi, endüstriyel standartlara uygun, geniş bağlantı elemanı uyumluluğu.
  • Profil Tipi: Ağır Tip – Geleneksel 40×80 profillere göre daha kalın et kalınlığı ve optimize edilmiş iç yapı ile yüksek yük kapasitesi ve burulma rijitliği sunar.
  • Yüzey İşlem: Doğal Eloksal (Anodik Oksidasyon), 20 mikron kalınlıkta, korozyon direnci, aşınma dayanımı ve estetik görünüm sağlar.
  • Standart: DIN EN 12020-2 ve EN 755-9 uluslararası normlarına uygun üretim.
  • Uygulama Alanları: Ağır Hizmet Makine Gövdeleri, CNC Tezgah Şasileri, Endüstriyel Otomasyon Sistemleri, Robotik Hücreler, Taşıyıcı Konstrüksiyonlar ve Titreşime Duyarlı Sistemler.
  • Montaj Kolaylığı: Modüler T-somunlar, cıvatalar ve özel bağlantı elemanları ile hızlı, esnek ve kaynak gerektirmeyen montaj imkanı.
  • Termal Özellikler: Alüminyumun yüksek ısı iletkenliği sayesinde termal yönetim gerektiren uygulamalarda avantaj.
  • Çevre Dostu: %100 geri dönüştürülebilir alüminyum malzeme, sürdürülebilir üretim ve kullanım.

Nedir Nerelerde Kullanılır?

40×80 Sigma Profil 10 Kanal Ağır Tip, endüstriyel otomasyon, makine imalatı ve genel konstrüksiyon alanlarında kullanılan, yüksek mukavemetli ve modüler bir yapı elemanıdır. Sigma profiller, özel geometrileri sayesinde T-kanal bağlantı sistemleriyle uyumlu çalışarak, karmaşık yapıların bile kolayca ve hızlıca monte edilmesini sağlar. «Ağır Tip» ibaresi, bu profilin standart 40×80 profillere göre daha kalın et kalınlığına, dolayısıyla çok daha yüksek bir atalet momentine ve burulma direncine sahip olduğunu gösterir. Bu özellik, profili özellikle yüksek statik ve dinamik yüklere maruz kalacak, titreşimin minimize edilmesi gereken veya yüksek rijitlik gerektiren uygulamalar için ideal kılar.

Bu özel profilin kullanım alanları oldukça geniştir ve endüstrinin birçok farklı kolunda kritik roller üstlenir. Başlıca kullanım alanları arasında CNC router, lazer kesim ve plazma kesim tezgahlarının sağlam ve titreşimsiz ana gövdelerinin oluşturulması yer alır. Otomasyon hatlarında, robotik hücrelerin iskelet yapılarında, ağır konveyör sistemlerinin taşıyıcı konstrüksiyonlarında, hassas ölçüm cihazları için stabil zeminler oluşturmada ve endüstriyel test tezgahlarında tercih edilir. Ayrıca, ergonomik ve modüler iş istasyonlarının, ağır yük taşıyıcı rafların, depolama sistemlerinin ve hatta fuar standları gibi geçici ama sağlam yapıların inşasında da sıklıkla kullanılır. Alüminyumun hafifliği, korozyon direnci ve eloksal kaplamanın sunduğu estetik görünüm sayesinde, temiz oda uygulamalarından laboratuvar ekipmanlarına kadar geniş bir yelpazede güvenle uygulanabilir. 10mm T-kanal sistemi, piyasadaki standart bağlantı elemanları, kapaklar, menteşeler ve diğer aksesuarlarla tam uyumluluk sağlayarak, kullanıcılara sınırsız tasarım ve entegrasyon esnekliği sunar. Bu sayede, mühendisler ve tasarımcılar, hızlı prototipleme ve seri üretim aşamalarında maliyet ve zaman avantajı elde ederler.

Fiyatlar Neden Uygun ?

Mermak CNC Otomasyon olarak, 40×80 Sigma Profil 10 Kanal Ağır Tip ürünlerimizi piyasadaki en rekabetçi fiyatlarla sunabilmemizin temelinde, güçlü tedarik zinciri yönetimimiz ve doğrudan ithalatçı kimliğimiz yatmaktadır. Biz, bu yüksek kaliteli endüstriyel profilleri, uluslararası alandaki güvenilir üreticilerden doğrudan ve büyük hacimlerde ithal etmekteyiz. Bu sayede, aracı firmaların getirdiği ek maliyetleri ve komisyonları tamamen ortadan kaldırarak, ürünlerin ilk elden, fabrika çıkış fiyatına yakın bir maliyetle ülkemize gelmesini sağlıyoruz. Büyük ölçekli alımlarımız, tedarikçilerle daha avantajlı anlaşmalar yapmamıza olanak tanırken, bu maliyet avantajını doğrudan müşterilerimize yansıtmaktayız.

Stoktan hızlı teslimat kapasitemiz, müşterilerimizin projelerini kesintisiz bir şekilde sürdürmelerine yardımcı olurken, aynı zamanda stok tutma maliyetlerimizi optimize etmemizi sağlar. Toptan satış odaklı iş modelimiz, hem bireysel müşterilere hem de büyük ölçekli endüstriyel projelere uygun fiyatlarla hizmet verme esnekliği sunar. Mermak CNC Otomasyon, sadece düşük fiyat garantisi vermekle kalmaz, aynı zamanda sunduğu ürünlerin kalitesinden asla ödün vermez. İthalatını yaptığımız tüm profiller, uluslararası kalite standartlarına ve teknik spesifikasyonlara tam uyumlu olup, ağır sanayi koşullarında dahi uzun ömürlü ve yüksek performanslı çalışacak şekilde tasarlanmıştır. Bu sayede, müşterilerimiz uygun fiyatlarla üstün kaliteli ürünlere erişirken, uzun vadede işletme maliyetlerinden de önemli ölçüde tasarruf ederler. Mermak CNC Otomasyon, endüstriyel otomasyon ve makine imalatı sektöründe, kaliteyi uygun fiyatla birleştiren güvenilir çözüm ortağınızdır.

Neden Bu Ürünü Seçmelisiniz?

  • Yüksek Mukavemet ve Rijitlik: Ağır tip tasarımı sayesinde, standart 40×80 profillere kıyasla çok daha yüksek eğilme ve burulma mukavemeti sunar. Bu özellik, profilin ağır statik ve dinamik yüklere maruz kalan, titreşime duyarlı makine gövdeleri ve taşıyıcı konstrüksiyonlar gibi kritik uygulamalarda üstün performans göstermesini sağlar. Sistem stabilitesini artırarak hassas işleme süreçlerinde dahi güvenilir bir temel oluşturur.
  • Mükemmel Modülerlik ve Esneklik: 10mm T-kanal sistemi, piyasadaki geniş bir bağlantı elemanı, aksesuar ve montaj bileşeni yelpazesiyle tam uyumludur. Bu modüler yapı, tasarım ve montaj süreçlerinde sınırsız esneklik sunar; hızlı prototipleme, kolay genişletme veya değişiklik yapabilme imkanı tanır. Kaynak veya özel işçilik gerektirmeden yapıları kolayca birleştirebilir veya ayırabilirsiniz.
  • Üstün Korozyon Direnci ve Estetik Görünüm: Yüksek kaliteli eloksal (anodik oksidasyon) kaplama, profili kimyasal etkilere, neme, aşınmaya ve paslanmaya karşı etkili bir şekilde korur. Bu sayede, zorlu endüstriyel ortamlar, nemli veya kimyasal buharlı alanlarda dahi uzun ömürlü kullanım sağlar. Aynı zamanda, profesyonel ve estetik bir görünüm kazandırarak makine ve ekipmanlarınızın görsel kalitesini artırır.
  • Hızlı ve Kolay Montaj/Demontaj: Özel bağlantı elemanları, T-somunlar ve diğer aksesuarlar sayesinde, 40×80 Ağır Tip Sigma Profil, kaynak veya karmaşık işleme teknikleri gerektirmeden hızlı ve verimli bir şekilde monte edilebilir. Bu durum, kurulum süresini önemli ölçüde kısaltır ve işçilik maliyetlerini düşürür. Gerektiğinde kolayca sökülüp yeniden yapılandırılabilmesi, sistemlerin taşınabilirliğini ve adaptasyon yeteneğini artırır.
  • Uzun Ömürlü ve Minimum Bakım Gerektiren Yapı: Alüminyumun doğal dayanıklılığı, T66 temperli alaşımın yüksek mukavemeti ve eloksal kaplamanın koruyucu özellikleri bir araya geldiğinde, ürün uzun yıllar boyunca ilk günkü performansını korur. Korozyona ve aşınmaya karşı dirençli yapısı sayesinde minimum düzeyde bakım gerektirir, böylece işletme maliyetlerini düşürür ve arıza riskini minimize eder.
  • Geniş Uygulama Alanı Uyumluluğu: Bu profil, CNC makine gövdelerinden endüstriyel otomasyon hatlarına, robotik hücrelerden modüler iş istasyonlarına kadar birçok farklı endüstriyel alanda yüksek performans ve güvenilirlik beklentilerini karşılayacak şekilde tasarlanmıştır. Çeşitli sektörlerdeki ağır hizmet uygulamaları için ideal bir yapısal çözüm sunar.

Detaylı Performans Verileri

Parametre
Değer ve Açıklama
Kesit Alanı (A)
Yaklaşık 12.85 cm² (Optimize edilmiş iç geometri ile yüksek mukavemet ve ağırlık dengesi sağlar.)
Ağırlık (Metre Başına)
Yaklaşık 3.47 kg/m (Ağır tip profilin sağladığı ilave malzeme, daha yüksek taşıma kapasitesi ve rijitlik demektir.)
Atalet Momenti (Ix-x)
Yaklaşık 27.2 cm⁴ (X ekseni etrafındaki eğilme direncini ifade eder; yüksek değer, ağır yükler altında minimum deformasyon anlamına gelir.)
Atalet Momenti (Iy-y)
Yaklaşık 8.5 cm⁴ (Y ekseni etrafındaki eğilme direncini ifade eder; güçlü yapısal bütünlük için optimize edilmiştir.)
Elastisite Modülü (E)
70 GPa (Alüminyum alaşımları için standart değer olup, malzemenin esneklik ve deformasyon direncini gösterir.)
Yüzey Sertliği (Eloksal)
>300 HV (Vickers Sertlik Değeri, eloksal kaplamanın aşınmaya ve çizilmeye karşı yüksek direncini belirtir.)
Tolerans Sınıfı
DIN EN 12020-2’ye göre, yüksek hassasiyetli montajlar ve milimetrik uyum için dar toleranslar.

Endüstriyel Uygulama Alanları

  • CNC Makine Gövdeleri ve Taşıyıcı Şasiler: Yüksek rijitlik gerektiren router, lazer ve plazma kesim makinelerinin ana iskeletleri.
  • Endüstriyel Otomasyon Hatları ve Konveyör Sistemleri: Ağır yük taşıyan bantlı, zincirli veya modüler konveyör sistemlerinin sağlam konstrüksiyonları.
  • Robotik Hücreler ve Manipülatör İskeletleri: Endüstriyel robotların stabil çalışma platformları ve yardımcı ekipmanların taşıyıcı yapıları.
  • Modüler İş İstasyonları ve Ergonomik Montaj Masaları: Ağır ekipmanların entegre edildiği, ayarlanabilir ve dayanıklı çalışma alanları.
  • Test ve Ölçüm Cihazı Konstrüksiyonları: Hassas ölçüm ve kalibrasyon sistemleri için titreşimsiz ve stabil alt yapılar.
  • Ağır Yük Depolama Rafları ve Çerçeveler: Endüstriyel depolama alanlarında yüksek ağırlık kapasiteli, modüler raf sistemleri.
  • Güneş Paneli Taşıyıcı Sistemler ve Özel Montaj Aparatları: Büyük ölçekli güneş enerjisi tesisatlarında dayanıklı ve uzun ömürlü taşıyıcı yapılar.
  • Temiz Oda Ekipmanları ve Laboratuvar Teçhizatı: Hijyen ve korozyon direncinin önemli olduğu özel ortamlar için yapısal elemanlar.
  • Fuar Standları ve Sergi Konstrüksiyonları: Büyük ve gösterişli fuar stantlarının sağlam ve demonte edilebilir iskelet yapıları.
  • Özel Makine Yapıları ve Prototipleme: Özel amaçlı makine tasarımlarında ve hızlı prototipleme projelerinde esnek ve dayanıklı çözüm.

Montaj ve Kullanım Notları

40×80 Sigma Profil 10 Kanal Ağır Tip ürününüzden maksimum verim almak ve uzun ömürlü kullanım sağlamak için bazı kritik montaj ve kullanım notlarına dikkat etmeniz gerekmektedir. Öncelikle, profillerin kesim işlemlerinde hassas ölçüm ve temiz kesim yüzeyleri elde etmek, bağlantı noktalarında boşluk oluşumunu engelleyerek yapısal bütünlüğü artırır. Montaj sırasında uygun tork değerlerinde sıkılmış bağlantı elemanları kullanmak, sistemin titreşimlere karşı direncini ve genel stabilitesini doğrudan etkiler. T-somunların ve diğer bağlantı elemanlarının kanal içine doğru şekilde yerleştirildiğinden emin olunmalıdır. Periyodik olarak, özellikle dinamik yüklere maruz kalan sistemlerde, tüm bağlantı noktalarının kontrol edilmesi ve gerekirse yeniden sıkılması, gevşemelerin önüne geçerek olası arızaları engeller. Eloksal kaplamanın korunması için, aşındırıcı kimyasallarla doğrudan temasından kaçınılmalı, temizlik için nötr pH’a sahip temizleyiciler ve yumuşak bezler tercih edilmelidir. Elektriksel iletkenlik gerektiren uygulamalarda, alüminyumun doğal iletkenliğinden faydalanılsa da, sistemin uygun şekilde topraklanması elektrostatik deşarj riskini minimize etmek ve güvenlik standartlarını sağlamak açısından hayati öneme sahiptir. Ağır yükler altında çalışacak sistemlerde, yük dağılımının homojen olmasına ve profilin taşıma kapasitesinin aşılmamasına özen gösterilmelidir. Uygun bağlantı teknikleri ve destek elemanları kullanarak yükün tüm yapıya eşit dağılması sağlanmalıdır. Bu basit ama etkili ipuçları, 40×80 Sigma Profilinizin performansını ve kullanım ömrünü önemli ölçüde artıracaktır.

Mermak Teknik Uzman Görüşü

Mermak CNC Otomasyon olarak, endüstriyel çözümlerimizle sektördeki lider konumumuzu korumanın gururunu yaşıyoruz. 40×80 Sigma Profil 10 Kanal Ağır Tip ürünümüz, mühendislik ekibimizin titiz çalışmaları ve kapsamlı kalite kontrol süreçlerinden geçerek, uluslararası standartlarda bir performans sunmaktadır. Bu profil, sadece bir alüminyum parçasından çok daha fazlasını ifade eder; yüksek mukavemeti, modüler yapısı ve üstün işleme kalitesiyle, en zorlu endüstriyel projelerinizde dahi güvenle kullanabileceğiniz, uzun vadeli bir yatırımdır. Ağır tip tasarımı, özellikle yüksek rijitlik, titreşim sönümleme ve ağır yük taşıma kapasitesi gerektiren uygulamalarda fark yaratır. CNC tezgahlarından robotik hücrelere, otomasyon hatlarından hassas ölçüm sistemlerine kadar geniş bir spektrumda, projelerinize dayanıklılık ve esneklik katar. Mermak CNC güvencesiyle sunduğumuz bu ürün, sadece uygun fiyat avantajıyla değil, aynı zamanda satış öncesi ve sonrası sağladığımız destekle de öne çıkar. Müşterilerimize Rusya, Kazakistan, Belarus, Kırgızistan, Özbekistan ve Azerbaycan gibi ülkelere ve benzer uluslararası pazarlara güvenilir lojistik çözümleriyle hizmet veriyoruz. Ankara’daki fabrikamızdan, güncel stok bilgileriyle hızlı sevkiyat sağlıyor, dikkatli paketleme ve fatura takibi ile süreci tamamlıyoruz. İhtiyaç duymanız halinde ürün videoları ve fabrika ziyareti için WhatsApp veya iletişim kanallarımızdan bize ulaşabilirsiniz. 16 yıllık tecrübemizle, projelerinizde yanınızdayız.

Mini hesaplayıcı bulunamadı.

Вес 2.760 кг
РАЗМЕР
Размер канала
Размер профиля

Değerlendirmeler

Bu ürün için henüz değerlendirme yok.

Корзина для покупок
Товар
40x80 Sigma Profil 10 Kanal Ağır Tip
Первоначальная цена составляла 50.68$.Текущая цена: 31.25$.
⚙ Инструменты
Müşteri Destek Merkezi
Sıfırla×
Прокрутить вверх
'; var w = window.open('', '_blank'); if(w && w.document){ w.document.open(); w.document.write(html); w.document.close(); } else { window.print(); } } function updateAdvisor(form, results){ var slug = form.getAttribute('data-mthc-calc') || ''; var level = 'ok'; var msg = 'Sonuç ön seçim için kullanılabilir. Kesin karar için emniyet payı, katalog sınırı ve saha testiyle doğrulayın.'; var bullets = ['Sınırda çıkan değeri tek başına ürün seçimi kabul etmeyin.', 'İlgili hesaplayıcılarla hız, tork, pulse, kablo ve güç tarafını birlikte kontrol edin.']; var product = 'İlgili ürün sınıfı için hesap sonucunu WhatsApp ile gönderip motor, sürücü, güç kaynağı, mekanik aktarım, pano ve yardımcı ekipmanı birlikte doğrulatın.'; var appText = text(form, 'application_area'); var appPrefix = appText ? 'Kullanım alanı: ' + appText + '. ' : ''; if(slug.indexOf('step') !== -1){ var tq = num(form,'torque_nm'), rpm = num(form,'rpm'), volt = num(form,'voltage'), hz = pickResult(results,'pulse frekansı'); if(tq >= 8){ product = 'Öneri sınıfı: NEMA 34 / NEMA 42 step motor, güçlü sürücü, 48–60V DC güç kaynağı ve uygun kablo kesiti.'; } else if(tq >= 3){ product = 'Öneri sınıfı: NEMA 34 step motor, DM860H sınıfı sürücü ve 48–60V DC güç kaynağı.'; } else { product = 'Öneri sınıfı: NEMA 23 / küçük NEMA 34 step motor ve uygun akımda sürücü.'; } if(rpm > 900 || hz > 80000 || (volt && volt < 48)){ level='mid'; msg='Step motor tarafında hız veya pulse sınırı risk oluşturabilir.'; } bullets = ['Hedef devirde kalan torku katalog eğrisinden kontrol edin.', 'Mikrostep yükseldikçe pulse ihtiyacı artar; güç artmaz.', 'Yüksek hız ve ağır eksende servo seçeneğini de değerlendirin.']; } else if(slug.indexOf('servo') !== -1){ var ratio = pickResult(results,'atalet oranı') || num(form,'ratio'); product = 'Öneri sınıfı: servo motor + uyumlu sürücü + gerekiyorsa frenli motor ve planet redüktör birlikte seçilmelidir.'; if(ratio > 8){ level='high'; msg='Servo atalet oranı yüksek görünüyor; tuning zorlaşabilir ve alarm riski artabilir.'; } else if(ratio > 5){ level='mid'; msg='Servo seçiminde atalet ve redüktör oranı dikkatli kontrol edilmeli.'; } bullets = ['Sürekli tork ve tepe torku ayrı kontrol edin.', 'Z ekseninde frenli servo tercih edin.', 'Atalet oranı yüksekse redüktör oranını veya motor gövdesini değiştirin.']; } else if(slug.indexOf('spindle') !== -1 || slug.indexOf('freze') !== -1 || slug.indexOf('talas') !== -1){ var chip = pickResult(results,'talaş yükü'), kw = pickResult(results,'önerilen güç') || pickResult(results,'güç ihtiyacı'); product = 'Öneri sınıfı: spindle gücü, inverter, ER pens, kesici takım ve soğutma tipi malzemeye göre birlikte seçilmelidir.'; if(chip && chip < 0.02){ level='mid'; msg='Talaş yükü düşük olabilir; takım kesmek yerine sürtüp ısı üretebilir.'; } else if(chip && chip > 0.12){ level='high'; msg='Talaş yükü yüksek olabilir; takım kırılması veya spindle zorlanması riski var.'; } else if(kw > 6){ level='mid'; msg='Güç ihtiyacı yüksek; makine rijitliği, vakum tutuşu ve inverter kapasitesi kontrol edilmeli.'; } bullets = ['Talaş rengi, ses, yüzey ve spindle akımıyla deneme kesimi yapın.', 'Alüminyumda talaş tahliyesi ve soğutma kritiktir.', 'Takım çapı büyüdükçe pens ve spindle rulman yükünü kontrol edin.']; } else if(slug.indexOf('vidali') !== -1){ var crit = pickResult(results,'kritik devir'), speed = pickResult(results,'eksen hızı'); product = 'Öneri sınıfı: vidalı mil, BK/BF yatak, kaplin, lineer kızak ve uygun motor birlikte değerlendirilmelidir.'; if(crit && speed){ level='mid'; msg='Uzun vidalı milde hız hedefi kritik devir ve titreşimle sınırlandırılabilir.'; } bullets = ['Hatve büyürse hız artar ama kuvvet azalır.', 'Uzun vidalı milde kritik devir ve burkulma kontrolü yapın.', 'Boşluk ve yataklama kalitesi teorik çözünürlükten daha önemlidir.']; } else if(slug.indexOf('kremayer') !== -1 || slug.indexOf('pinyon') !== -1 || slug.indexOf('reduktor') !== -1){ product = 'Öneri sınıfı: modüle uygun kremayer, pinyon, planet redüktör ve servo/step motor beraber seçilmelidir.'; bullets = ['Pinyon büyürse hız artar, itme kuvveti düşer.', 'Redüktör oranı torku artırır fakat hızı azaltır.', 'Backlash ve diş teması hassasiyeti doğrudan etkiler.']; } else if(slug.indexOf('vakum') !== -1 || slug.indexOf('blower') !== -1){ product = 'Öneri sınıfı: tabla alanı, bölge sayısı, kaçak oranı ve malzemeye göre blower/vakum pompası seçilmelidir.'; bullets = ['Küçük parçada teorik tutma kuvveti hızla düşer.', 'MDF spoilboard kaçağı debi ihtiyacını artırır.', 'Yetersiz vakumda paso ve ilerlemeyi düşürün.']; } else if(slug.indexOf('pano') !== -1 || slug.indexOf('kablo') !== -1 || slug.indexOf('sigorta') !== -1 || slug.indexOf('inverter') !== -1 || slug.indexOf('elektrik') !== -1){ product = 'Öneri sınıfı: inverter, kablo kesiti, sigorta, pano fanı, kontaktör ve topraklama birlikte planlanmalıdır.'; bullets = ['Kabloyu yalnız akıma göre değil uzunluk ve gerilim düşümüne göre seçin.', 'Sigorta kabloyu korur; cihaz üretici önerisi ayrıca kontrol edilir.', 'Pano sıcaklığı gerçek yükte ölçülmelidir.']; } else if(slug.indexOf('dxf') !== -1 || slug.indexOf('gcode') !== -1 || slug.indexOf('g-code') !== -1){ product = 'Öneri sınıfı: CAM hazırlığı, takım çapı, iç/dış kesim yönü ve süre/maliyet hesabı birlikte kontrol edilmelidir.'; bullets = ['Açık kontur, çift çizgi ve yanlış layer kesim hatası üretir.', 'G90/G91 ve G20/G21 durumunu çalıştırmadan önce kontrol edin.', 'Kesin teklif için DXF/CAM dosyası ayrıca incelenmelidir.']; } else if(slug.indexOf('lastik') !== -1){ product = 'Kontrol özeti: lastik ölçüsü değişiminde toplam çap, çevre, yerden yükseklik ve km saati farkı birlikte değerlendirilmelidir.'; bullets = ['Çap farkı büyüdükçe km saati, kilometre sayacı, hızlanma, frenleme ve aktarma yükleri daha fazla etkilenir.', 'Lastik ölçüsü seçerken jant genişliği, ofset, çamurluk boşluğu, yük endeksi ve hız endeksi ayrıca kontrol edilmelidir.', '4x4 araçlarda ön ve arka lastik çevreleri farklı olmamalıdır; aktarma organlarına yük bindirebilir.']; } else if(slug.indexOf('agirlik') !== -1 || slug.indexOf('malzeme') !== -1){ product = 'Öneri sınıfı: ağırlık sonucu malzeme alımı, kargo, vinç/forklift, konstrüksiyon ve teklif planında kullanılabilir; kesin sevkiyat için kantar veya üretici verisi kontrol edilmelidir.'; bullets = ['Ahşap, MDF ve benzeri malzemelerde nem ağırlığı ciddi değiştirir.', 'Boru ve kutu profilde gerçek et kalınlığı katalog değerinden farklıysa sonuç sapar.', 'Taşıma ve kaldırma planında ağırlık merkezi ve emniyet payı ayrıca değerlendirilmelidir.']; } else if(slug.indexOf('maliyet') !== -1 || slug.indexOf('teklif') !== -1 || slug.indexOf('yatirim') !== -1){ product = 'Öneri sınıfı: makine saati, takım sarfı, elektrik, bakım, fire ve kâr oranı satış fiyatına birlikte yansıtılmalıdır.'; bullets = ['Hazırlık süresi küçük adetlerde parça maliyetini belirler.', 'Takım kırılma ve fire payı yoksa teklif zarar ettirebilir.', 'Yatırım geri dönüşü kapasite kullanımına bağlıdır.']; } else if(slug.indexOf('blower') !== -1 || slug.indexOf('fan') !== -1 || slug.indexOf('pompa') !== -1){ product = 'Öneri sınıfı: motor gücü, inverter, kablo kesiti, sigorta ve uygulama debi/basınç ihtiyacı birlikte seçilmelidir.'; bullets = ['Fan ve blower uygulamalarında debi ile basınç birlikte okunmalıdır.', 'Pompa tarafında basma yüksekliği ve verim motor gücünü ciddi değiştirir.', 'İnverter kullanılıyorsa motor akımı ve soğutma koşulları ayrıca kontrol edilir.']; } else if(slug.indexOf('konveyor') !== -1 || slug.indexOf('otomasyon') !== -1 || slug.indexOf('plc') !== -1 || slug.indexOf('sensor') !== -1 || slug.indexOf('solenoid') !== -1 || slug.indexOf('ups') !== -1 || slug.indexOf('jenerator') !== -1){ product = 'Öneri sınıfı: otomasyon güç kaynağı, PLC/sensör/valf besleme, motor sürücü, UPS veya jeneratör kapasitesi uygulama alanına göre birlikte planlanmalıdır.'; bullets = ['24V yardımcı beslemede sensör, röle, valf ve PLC aynı anda çalışabilir.', 'Kalkış akımı olan yüklerde güç kaynağı ve koruma elemanları sınırda seçilmemelidir.', 'Yedekleme süresi hesabında akü yaşlanması ve sıcaklık etkisi eklenmelidir.']; } if(appText){ bullets.unshift('Kullanım alanı seçimi: ' + appText + '. Aynı hesap sonucu CNC, konveyör, pompa, blower, pano veya genel otomasyonda farklı emniyet payı gerektirebilir.'); product = appPrefix + product; } var sahaBullets = buildSahaContextBullets(form, slug, results); if(sahaBullets.length){ bullets = sahaBullets.concat(bullets); } setAdvisor(form, level, msg, bullets, product); } function normalizeTireInput(value){ return String(value || '').trim().replace(/,/g, '.').replace(/\s+/g, ' ').toUpperCase(); } function parseTireSize(value){ var raw = normalizeTireInput(value); if(!raw){ return null; } var m = raw.match(/^(\d{3})\s*(?:\/|\s|-)\s*(\d{2,3})\s*(?:R|ZR)?\s*(\d{2})$/i); if(m){ var widthMm = parseFloat(m[1]); var aspect = parseFloat(m[2]); var rimIn = parseFloat(m[3]); var sidewallMm = widthMm * aspect / 100; var rimMm = rimIn * 25.4; var diameterMm = rimMm + 2 * sidewallMm; return buildTireObject(raw, 'Metrik', widthMm, aspect, rimIn, sidewallMm, diameterMm); } m = raw.match(/^(\d{2,3}(?:\.\d+)?)\s*[X×]\s*(\d{1,2}(?:\.\d+)?)\s*(?:R)?\s*(\d{2})$/i); if(m){ var diaIn = parseFloat(m[1]); var widthIn = parseFloat(m[2]); var rimIn2 = parseFloat(m[3]); var diameterMm2 = diaIn * 25.4; var widthMm2 = widthIn * 25.4; var rimMm2 = rimIn2 * 25.4; var sidewallMm2 = (diameterMm2 - rimMm2) / 2; var aspect2 = widthMm2 > 0 ? sidewallMm2 / widthMm2 * 100 : 0; return buildTireObject(raw, 'İnç', widthMm2, aspect2, rimIn2, sidewallMm2, diameterMm2); } return null; } function buildTireObject(raw, type, widthMm, aspect, rimIn, sidewallMm, diameterMm){ var rimMm = rimIn * 25.4; var circMm = diameterMm * PI; return { raw: raw, type: type, widthMm: widthMm, aspect: aspect, rimIn: rimIn, rimMm: rimMm, sidewallMm: sidewallMm, diameterMm: diameterMm, diameterIn: diameterMm / 25.4, circumferenceMm: circMm, circumferenceM: circMm / 1000, revPerKm: circMm > 0 ? 1000000 / circMm : 0 }; } function tireResultCards(prefix, tire){ return [ add(prefix + ' toplam dış çap', tire.diameterMm, 'mm', tire.raw + ' ölçüsünün teorik toplam lastik yüksekliği'), add(prefix + ' toplam dış çap', tire.diameterIn, 'inç', 'İnç karşılığı'), add(prefix + ' yanak yüksekliği', tire.sidewallMm, 'mm', 'Jant kenarı ile lastik dış çapı arasındaki tek taraflı yanak ölçüsü'), add(prefix + ' taban genişliği', tire.widthMm, 'mm', 'Lastik taban genişliği'), add(prefix + ' jant çapı', tire.rimIn, 'inç', 'Jant ölçüsü'), add(prefix + ' bir turda aldığı yol', tire.circumferenceM, 'm', 'Lastik bir tam tur döndüğünde teorik ilerleme'), add(prefix + ' kilometrede dönüş', tire.revPerKm, 'tur/km', '1 km gitmek için yaklaşık teker dönüş sayısı') ]; } function weightShapeFromSlug(slug){ var map = { 'sac-plaka-agirlik-hesaplama': 'plate', 'blok-kutuk-agirlik-hesaplama': 'block', 'yuvarlak-mil-agirlik-hesaplama': 'round_bar', 'boru-agirlik-hesaplama': 'pipe', 'daire-disk-agirlik-hesaplama': 'round_plate', 'kare-mil-agirlik-hesaplama': 'square_bar', 'kare-kutu-profil-agirlik-hesaplama': 'square_tube', 'dikdortgen-kutu-profil-agirlik-hesaplama': 'rect_tube', 'altigen-mil-agirlik-hesaplama': 'hex_bar', 'kosebent-agirlik-hesaplama': 'angle_l' }; return map[slug] || ''; } function isWeightCalculatorSlug(slug){ return slug === 'malzeme-agirlik-hesaplama' || weightShapeFromSlug(slug) !== ''; } function updateWeightFieldVisibility(form){ var slug = form.getAttribute('data-mthc-calc') || ''; if(!isWeightCalculatorSlug(slug)){ return; } var shapeValue = form.elements['shape_type'] ? form.elements['shape_type'].value : (weightShapeFromSlug(slug) || 'plate'); var materialValue = form.elements['material_density'] ? String(form.elements['material_density'].value) : ''; var all = ['custom_density','length_mm','width_mm','height_mm','thickness_mm','diameter_mm','inner_diameter_mm','side_mm','wall_mm','leg_a_mm','leg_b_mm']; var map = { plate: ['length_mm','width_mm','thickness_mm'], block: ['length_mm','width_mm','height_mm'], round_bar: ['diameter_mm','length_mm'], pipe: ['diameter_mm','inner_diameter_mm','length_mm'], round_plate: ['diameter_mm','thickness_mm'], square_bar: ['side_mm','length_mm'], square_tube: ['side_mm','wall_mm','length_mm'], rect_tube: ['width_mm','height_mm','wall_mm','length_mm'], hex_bar: ['side_mm','length_mm'], angle_l: ['leg_a_mm','leg_b_mm','wall_mm','length_mm'] }; var visible = (map[shapeValue] || map.plate).slice(); if(materialValue === '0'){ visible.push('custom_density'); } all.forEach(function(name){ var el = form.elements[name]; if(!el){ return; } var field = el.closest ? el.closest('.mthc-field') : null; if(!field){ return; } var show = visible.indexOf(name) !== -1; field.style.display = show ? '' : 'none'; field.setAttribute('aria-hidden', show ? 'false' : 'true'); }); } function weightShapeHint(shape){ var hints = { plate: 'Plaka hesabı: uzunluk × genişlik × kalınlık.', block: 'Blok hesabı: uzunluk × genişlik × yükseklik.', round_bar: 'Dolu silindir hesabı: çap ve boy ile hacim bulunur.', pipe: 'Boru hesabı: dış çap hacminden iç çap boşluğu düşülür.', round_plate: 'Disk hesabı: daire alanı × kalınlık.', square_bar: 'Dolu kare mil hesabı: kare kesit alanı × boy.', square_tube: 'Kare kutu profil hesabı: dış kareden iç boşluk düşülür.', rect_tube: 'Dikdörtgen kutu profil hesabı: dış dikdörtgenden iç boşluk düşülür.', hex_bar: 'Altıgen dolu mil hesabı: karşılıklı yüz ölçüsünden kesit alanı bulunur.', angle_l: 'Köşebent hesabı: iki kanat alanından ortak köşe payı düşülür.' }; return hints[shape] || hints.plate; } function parseCutList(raw){ var items = []; String(raw || '').split(/[;\n,]+/).forEach(function(part){ var s = part.trim().toLowerCase(); if(!s){ return; } s = s.replace(/mm/g,'').replace(/adet/g,'').replace(/\s+/g,''); var m = s.match(/([0-9]+(?:[\.,][0-9]+)?)(?:x|\*)([0-9]+(?:[\.,][0-9]+)?)/); if(m){ var len = parseFloat(m[1].replace(',','.')); var qty = Math.round(parseFloat(m[2].replace(',','.'))); if(isFinite(len) && len > 0 && isFinite(qty) && qty > 0){ items.push({len:len, qty:qty}); } } else { var v = parseFloat(s.replace(',','.')); if(isFinite(v) && v > 0){ items.push({len:v, qty:1}); } } }); return items; } function calculate(form){ var slug = form.getAttribute('data-mthc-calc'); var r = []; switch(slug){ case 'lastik-olcusu-hesaplama': { var original = parseTireSize(text(form,'original_tire_size')); var newer = parseTireSize(text(form,'new_tire_size')); var indicated = num(form,'indicated_speed_kmh') || 100; if(!original && !newer){ r = []; break; } if(original){ r = r.concat(tireResultCards('Orijinal lastik', original)); } if(newer){ r = r.concat(tireResultCards('Yeni lastik', newer)); } if(original && newer){ var ratio = newer.circumferenceMm / original.circumferenceMm; var diaDiff = newer.diameterMm - original.diameterMm; var diaPct = original.diameterMm > 0 ? diaDiff / original.diameterMm * 100 : 0; var circDiff = newer.circumferenceMm - original.circumferenceMm; var actualSpeed = indicated * ratio; var speedDiff = actualSpeed - indicated; var speedPct = indicated > 0 ? speedDiff / indicated * 100 : 0; var actualDistance = 100 * ratio; r.push(add('Çap farkı', diaDiff, 'mm', 'Yeni lastik çapı ile orijinal lastik çapı arasındaki fark')); r.push(add('Çap farkı', diaPct, '%', 'Pozitif değer yeni lastiğin daha büyük olduğunu gösterir')); r.push(add('Araç yüksekliği değişimi', diaDiff / 2, 'mm', 'Yerden yükseklik yaklaşık çap farkının yarısı kadar değişir')); r.push(add('Çevre farkı', circDiff / 1000, 'm/tur', 'Yeni lastiğin her turda fazladan veya eksik aldığı yol')); r.push(add('Km saati ' + fmt(indicated,0) + ' gösterirken gerçek hız', actualSpeed, 'km/saat', 'Lastik çapı büyürse gerçek hız genelde daha yüksek çıkar')); r.push(add('Km saati sapması', speedPct, '%', 'Pozitif değer km saatinin olduğundan düşük gösterdiği anlamına gelir')); r.push(add('Sayaç 100 km gösterirken gerçek yol', actualDistance, 'km', 'Kilometre sayacı teorik farkı')); } break; } case 'kargo-desi-hacimsel-agirlik-hesaplama': { var L = num(form,'package_length_cm'), W = num(form,'package_width_cm'), H = num(form,'package_height_cm'); var q = Math.max(1, num(form,'package_quantity') || 1); var realEach = Math.max(0, num(form,'actual_weight_kg') || 0); var div = num(form,'desi_divisor') || 3000; var desiEach = (L * W * H) / div; var volumeM3Each = (L * W * H) / 1000000; var realTotal = realEach * q; var desiTotal = desiEach * q; var chargeable = Math.max(realTotal, desiTotal); r = [ add('Tek koli desi / hacimsel ağırlık', desiEach, 'kg', 'Koli dış ölçülerine göre'), add('Toplam desi / hacimsel ağırlık', desiTotal, 'kg', 'Koli adedi dahil'), add('Toplam gerçek tartı ağırlığı', realTotal, 'kg', 'Girilen gerçek ağırlık × koli adedi'), add('Yaklaşık esas alınacak ağırlık', chargeable, 'kg', 'Gerçek ağırlık ve hacimsel ağırlıktan büyük olan'), add('Toplam hacim', volumeM3Each * q, 'm³', 'Paketlerin toplam hacmi') ]; break; } case 'profil-kesim-fire-hesaplama': { var stock = num(form,'stock_length_mm') || 6000; var kerf = Math.max(0, num(form,'kerf_mm') || 0); var kgm = Math.max(0, num(form,'profile_weight_kg_m') || 0); var endWaste = Math.max(0, num(form,'usable_end_waste_mm') || 0); var list = parseCutList(text(form,'cut_list_text')); var pieces = 0, netLen = 0; list.forEach(function(x){ pieces += x.qty; netLen += x.len * x.qty; }); var cutLoss = pieces * kerf; var usableStock = Math.max(1, stock - endWaste); var bars = Math.ceil((netLen + cutLoss) / usableStock); var boughtLen = bars * stock; var wasteLen = Math.max(0, boughtLen - netLen - cutLoss); var totalKg = kgm > 0 ? boughtLen / 1000 * kgm : 0; var netKg = kgm > 0 ? netLen / 1000 * kgm : 0; var wastePct = boughtLen > 0 ? wasteLen / boughtLen * 100 : 0; r = [ add('Toplam net kesilecek boy', netLen / 1000, 'm', 'Parça boyları × adet'), add('Toplam parça adedi', pieces, 'adet', 'Kesim listesinden okunan toplam parça'), add('Yaklaşık kesim payı', cutLoss / 1000, 'm', 'Testere payı dahil'), add('Gerekli standart boy adedi', bars, 'boy', 'Basit toplam metraj hesabıyla'), add('Yaklaşık fire', wasteLen / 1000, 'm', 'Standart boydan kalan yaklaşık miktar'), add('Fire oranı', wastePct, '%', 'Yaklaşık fire / alınan toplam boy') ]; if(kgm > 0){ r.push(add('Alınacak yaklaşık ağırlık', totalKg, 'kg', 'Standart boy adedi × kg/m')); r.push(add('Net parça ağırlığı', netKg, 'kg', 'Sadece kesilecek net parçalar')); } break; } case 'kablo-gerilim-dusumu-hesaplama': { var sys = form.elements['cable_system'] ? form.elements['cable_system'].value : 'dc'; var V = num(form,'voltage_v') || 24, I = num(form,'current_a'), lenM = num(form,'cable_length_m'), S = num(form,'cable_section_mm2') || 1; var mat = form.elements['cable_material'] ? form.elements['cable_material'].value : 'cu'; var rho = mat === 'al' ? 0.0282 : 0.0175; var pf = Math.max(0.1, Math.min(1, num(form,'power_factor') || 1)); var drop = 0; if(sys === 'ac3'){ var rOne = rho * lenM / S; drop = Math.sqrt(3) * I * rOne * pf; } else { var rLoop = rho * (2 * lenM) / S; drop = I * rLoop * (sys === 'ac1' ? pf : 1); } var pctDrop = V > 0 ? drop / V * 100 : 0; var loadV = V - drop; r = [ add('Yaklaşık gerilim düşümü', drop, 'V', 'Kablo direnci ve akıma göre'), add('Gerilim düşümü oranı', pctDrop, '%', 'Besleme voltajına göre kayıp'), add('Yük ucunda kalan voltaj', loadV, 'V', 'Cihaz tarafında yaklaşık görülecek voltaj'), add('Kablo direnç katsayısı', rho, 'Ω·mm²/m', mat === 'al' ? 'Alüminyum iletken' : 'Bakır iletken') ]; break; } case 'motor-kw-hp-amper-kva-hesaplama': { var kwOut = num(form,'motor_power_kw'); var phase = num(form,'motor_phase') || 3; var voltage = num(form,'line_voltage_v') || 380; var eff = Math.max(1, Math.min(100, num(form,'motor_efficiency') || 85)) / 100; var pf2 = Math.max(0.1, Math.min(1, num(form,'power_factor') || 0.85)); var inputKw = eff > 0 ? kwOut / eff : kwOut; var hp = kwOut / 0.7457; var kva = inputKw / pf2; var amp = phase === 3 ? (kva * 1000) / (Math.sqrt(3) * voltage) : (kva * 1000) / voltage; r = [ add('Motor gücü', hp, 'HP', 'kW değerinin beygir gücü karşılığı'), add('Yaklaşık giriş gücü', inputKw, 'kW', 'Verim dikkate alınmış elektriksel giriş gücü'), add('Yaklaşık görünür güç', kva, 'kVA', 'Güç faktörü dikkate alınmış değer'), add('Yaklaşık hat akımı', amp, 'A', phase === 3 ? 'Üç faz hat akımı' : 'Tek faz hat akımı') ]; break; } case 'basinc-debi-hava-tuketimi-hesaplama': { var dia = num(form,'cylinder_diameter_mm'), stroke = num(form,'stroke_mm'); var cyc = num(form,'cycles_min'), press = num(form,'working_pressure_bar'); var acting = num(form,'acting_type') || 2, count = Math.max(1, num(form,'cylinder_count') || 1); var margin = Math.max(0, num(form,'leak_margin_percent') || 0) / 100; var volLStroke = (PI * Math.pow(dia/2,2) * stroke) / 1000000; var freeAirLMin = volLStroke * acting * cyc * count * (press + 1) * (1 + margin); var m3h = freeAirLMin * 60 / 1000; var cfm = freeAirLMin / 28.3168; r = [ add('Silindir tek strok hacmi', volLStroke, 'L', 'Piston alanı × strok'), add('Yaklaşık serbest hava tüketimi', freeAirLMin, 'L/dk', 'Basınç, çevrim, adet ve kaçak payı dahil'), add('Yaklaşık serbest hava tüketimi', m3h, 'm³/saat', ''), add('Yaklaşık serbest hava tüketimi', cfm, 'CFM', '1 CFM ≈ 28.3 L/dk') ]; break; } case 'malzeme-fiyat-fire-hesaplama': { var pwkg = num(form,'piece_weight_kg'), q2 = Math.max(1, num(form,'piece_quantity') || 1); var price = num(form,'unit_price_per_kg'), waste2 = Math.max(0, num(form,'waste_percent') || 0) / 100; var proc = Math.max(0, num(form,'processing_cost_total') || 0), tax = Math.max(0, num(form,'tax_percent') || 0) / 100; var netKg = pwkg * q2; var buyKg = netKg * (1 + waste2); var matCost = buyKg * price; var subtotal = matCost + proc; var taxAmount = subtotal * tax; var total = subtotal + taxAmount; r = [ add('Toplam net ağırlık', netKg, 'kg', 'Tek parça ağırlığı × adet'), add('Fire dahil alınacak ağırlık', buyKg, 'kg', 'Fire oranı eklenmiş yaklaşık ihtiyaç'), add('Malzeme bedeli', matCost, 'TL', 'Kg fiyatı × fire dahil ağırlık'), add('Ara toplam', subtotal, 'TL', 'Malzeme + işlem bedeli'), add('Vergi tutarı', taxAmount, 'TL', 'Girilen orana göre'), add('Genel toplam', total, 'TL', 'Vergi dahil toplam'), add('Parça başı yaklaşık maliyet', total / q2, 'TL/adet', 'Genel toplam / adet') ]; break; } case 'alan-hacim-kesit-hesaplama': { var gt = form.elements['geometry_type'] ? form.elements['geometry_type'].value : 'rectangle_area'; var Lmm = num(form,'length_mm'), Wmm = num(form,'width_mm'), Hmm = num(form,'height_mm'), Dmm = num(form,'diameter_mm'), IDmm = num(form,'inner_diameter_mm'), wallmm = num(form,'wall_mm'); var areaMm2 = 0, volMm3 = 0; var note = ''; if(gt === 'rectangle_area'){ areaMm2 = Lmm * Wmm; note = 'Uzunluk × genişlik'; } else if(gt === 'circle_area'){ areaMm2 = PI * Math.pow(Dmm/2,2); note = 'Daire alanı'; } else if(gt === 'ring_area'){ areaMm2 = PI * (Math.pow(Dmm/2,2) - Math.pow(IDmm/2,2)); note = 'Dış daireden iç daire düşüldü'; } else if(gt === 'box_volume'){ volMm3 = Lmm * Wmm * Hmm; areaMm2 = Lmm * Wmm; note = 'Dikdörtgen prizma'; } else if(gt === 'cylinder_volume'){ areaMm2 = PI * Math.pow(Dmm/2,2); volMm3 = areaMm2 * Lmm; note = 'Silindir hacmi'; } else if(gt === 'pipe_section'){ areaMm2 = PI * (Math.pow(Dmm/2,2) - Math.pow(IDmm/2,2)); note = 'Boru kesit alanı'; } else if(gt === 'rect_tube_section'){ areaMm2 = Wmm*Hmm - Math.max(Wmm-2*wallmm,0)*Math.max(Hmm-2*wallmm,0); note = 'Kutu profil kesit alanı'; } areaMm2 = Math.max(0, areaMm2); volMm3 = Math.max(0, volMm3); r = [ add('Hesaplanan alan / kesit', areaMm2, 'mm²', note), add('Hesaplanan alan / kesit', areaMm2 / 100, 'cm²', ''), add('Hesaplanan alan', areaMm2 / 1000000, 'm²', ''), add('Hacim', volMm3 / 1000, 'cm³', 'Hacim hesabı seçildiyse'), add('Hacim', volMm3 / 1000000, 'L', '1 L = 1000 cm³'), add('Hacim', volMm3 / 1000000000, 'm³', '') ]; break; } case 'malzeme-agirlik-hesaplama': case 'sac-plaka-agirlik-hesaplama': case 'blok-kutuk-agirlik-hesaplama': case 'yuvarlak-mil-agirlik-hesaplama': case 'boru-agirlik-hesaplama': case 'daire-disk-agirlik-hesaplama': case 'kare-mil-agirlik-hesaplama': case 'kare-kutu-profil-agirlik-hesaplama': case 'dikdortgen-kutu-profil-agirlik-hesaplama': case 'altigen-mil-agirlik-hesaplama': case 'kosebent-agirlik-hesaplama': { updateWeightFieldVisibility(form); var density = num(form,'material_density'); if(density <= 0){ density = num(form,'custom_density'); } var shape = form.elements['shape_type'] ? form.elements['shape_type'].value : (weightShapeFromSlug(slug) || 'plate'); var len = num(form,'length_mm'), w = num(form,'width_mm'), h = num(form,'height_mm'), th = num(form,'thickness_mm'); var d = num(form,'diameter_mm'), id = num(form,'inner_diameter_mm'), side = num(form,'side_mm'), wall = num(form,'wall_mm'); var la = num(form,'leg_a_mm'), lb = num(form,'leg_b_mm'); var qty = Math.max(1, num(form,'quantity') || 1); var waste = Math.max(0, num(form,'waste_percent') || 0) / 100; var volume = 0; var valid = true; var hint = weightShapeHint(shape); if(density <= 0){ valid = false; hint = 'Yoğunluk sıfırdan büyük olmalıdır.'; } if(shape === 'plate'){ volume = len * w * th; } else if(shape === 'block'){ volume = len * w * h; } else if(shape === 'round_bar'){ volume = PI * Math.pow(d/2, 2) * len; } else if(shape === 'pipe'){ if((!form.elements['inner_diameter_mm']) && wall > 0){ id = Math.max(d - 2 * wall, 0); } if(id >= d){ valid = false; hint = 'Boru hesabında iç çap dış çaptan küçük olmalıdır. Et kalınlığı dış çapın yarısından küçük olmalıdır.'; } volume = PI * (Math.pow(d/2, 2) - Math.pow(id/2, 2)) * len; } else if(shape === 'round_plate'){ volume = PI * Math.pow(d/2, 2) * th; } else if(shape === 'square_bar'){ volume = side * side * len; } else if(shape === 'square_tube'){ if(wall*2 >= side){ valid = false; hint = 'Kare kutu profilde et kalınlığı dış kenarın yarısından küçük olmalıdır.'; } volume = (side*side - Math.pow(Math.max(side - 2*wall, 0), 2)) * len; } else if(shape === 'rect_tube'){ if(wall*2 >= w || wall*2 >= h){ valid = false; hint = 'Dikdörtgen kutu profilde et kalınlığı dış genişlik ve yüksekliğin yarısından küçük olmalıdır.'; } volume = (w*h - Math.max(w - 2*wall, 0) * Math.max(h - 2*wall, 0)) * len; } else if(shape === 'hex_bar'){ volume = (Math.sqrt(3) / 2) * side * side * len; } else if(shape === 'angle_l'){ if(wall >= la || wall >= lb){ valid = false; hint = 'Köşebentte et kalınlığı kanat ölçülerinden küçük olmalıdır.'; } volume = (la*wall + lb*wall - wall*wall) * len; } volume = Math.max(0, volume); var cm3 = volume / 1000; var kgEach = valid ? (cm3 * density / 1000) : 0; var kgTotal = kgEach * qty * (1 + waste); var ton = kgTotal / 1000; var meterWeight = (len > 0 && ['round_bar','pipe','square_bar','square_tube','rect_tube','hex_bar','angle_l'].indexOf(shape) !== -1) ? kgEach / (len / 1000) : 0; var kgM2 = (shape === 'plate' || shape === 'round_plate') ? density * th : 0; r = [ add('Tek parça yaklaşık ağırlık', kgEach, 'kg', hint), add('Toplam yaklaşık ağırlık', kgTotal, 'kg', 'Adet ve fire/emniyet payı dahil'), add('Toplam yaklaşık ağırlık', ton, 'ton', ''), add('Hesaplanan hacim', cm3, 'cm³', 'Seçilen geometriye göre teorik hacim'), add('Kullanılan yoğunluk', density, 'g/cm³', 'Malzeme cinsine göre') ]; if(meterWeight > 0){ r.push(add('Yaklaşık metre ağırlığı', meterWeight, 'kg/m', 'Aynı kesitte 1 metre parça ağırlığı')); } if(kgM2 > 0){ r.push(add('Yaklaşık metrekare ağırlığı', kgM2, 'kg/m²', 'Aynı kalınlıkta 1 m² levha ağırlığı')); } break; } case 'vidali-mil-hiz-hesabi': { var motorRpm = num(form,'motor_rpm'), lead = num(form,'lead_mm'), ratio = num(form,'ratio') || 1; var screwRpm = motorRpm / ratio; var speed = screwRpm * lead; r = [add('Vidanın dönüş devri', screwRpm, 'rpm', 'Redüktör sonrası vida devri'), add('Teorik eksen hızı', speed, 'mm/dk', 'Kontrol yazılımındaki teorik hızlı hareket sınırı'), add('Teorik eksen hızı', speed/1000, 'm/dk', ''), add('Teorik eksen hızı', speed/60, 'mm/sn', '')]; break; } case 'vidali-mil-motor-devir-hesabi': { var targetSpeed = num(form,'target_speed'), lead2 = num(form,'lead_mm') || 1, ratio2 = num(form,'ratio') || 1; var screwNeed = targetSpeed / lead2; var motorNeed = screwNeed * ratio2; r = [add('Gerekli vida devri', screwNeed, 'rpm', ''), add('Gerekli motor devri', motorNeed, 'rpm', 'Motorun bu devri yük altında çevirebilmesi gerekir')]; break; } case 'vidali-mil-itme-kuvveti-hesabi': { var t = num(form,'motor_torque_nm'), ratio3 = num(form,'ratio') || 1, eff = num(form,'efficiency')/100, lead3 = num(form,'lead_mm')/1000; var screwTorque = t * ratio3 * eff; var forceN = lead3 > 0 ? (2 * PI * screwTorque) / lead3 : 0; r = [add('Vida girişindeki yaklaşık tork', screwTorque, 'Nm', ''), add('Teorik itme kuvveti', forceN, 'N', ''), add('Teorik itme kuvveti', forceN/KGF, 'kgf', '')]; break; } case 'vidali-mil-tork-ihtiyaci-hesabi': { var forceKg = num(form,'target_force_kgf'), lead4 = num(form,'lead_mm')/1000, ratio4 = num(form,'ratio') || 1, eff4 = num(form,'efficiency')/100; var force = forceKg * KGF; var motorTorque = (ratio4 * eff4) > 0 ? (force * lead4) / (2 * PI * ratio4 * eff4) : 0; r = [add('Hedef kuvvet', force, 'N', ''), add('Gerekli yaklaşık motor torku', motorTorque, 'Nm', 'Emniyet payı eklenmeden teorik değer'), add('Gerekli yaklaşık motor torku', motorTorque*10.1972, 'kgf·cm', '')]; break; } case 'vidali-mil-cozunurluk-hesabi': { var steps = num(form,'motor_steps'), micro = num(form,'microstep') || 1, ratio5 = num(form,'ratio') || 1, lead5 = num(form,'lead_mm') || 1; var stepsPerMm = steps * micro * ratio5 / lead5; r = [add('Kontrol ayarı', stepsPerMm, 'step/mm', 'Yazılıma girilecek başlangıç değeri'), add('Bir pulse ile teorik hareket', 1/stepsPerMm, 'mm', ''), add('Bir pulse ile teorik hareket', (1/stepsPerMm)*1000, 'mikron', ''), add('100 mm hareket için pulse', stepsPerMm*100, 'pulse', '')]; break; } case 'vidali-mil-kritik-devir-yaklasik': { var dmm = num(form,'root_diameter_mm'), lmm = num(form,'unsupported_length_mm'), cs = num(form,'support_factor'); var din = dmm / 25.4; var lin = lmm / 25.4; var critical = lin > 0 ? cs * 4.76e6 * din / (lin * lin) : 0; r = [add('Yaklaşık kritik devir', critical, 'rpm', 'Rezonans bölgesine yaklaşmamak gerekir'), add('80% emniyetli üst sınır', critical*0.8, 'rpm', 'Ön kontrol için daha güvenli kabul'), add('70% daha muhafazakâr sınır', critical*0.7, 'rpm', '')]; break; } case 'reduktor-cikis-deviri-hesabi': { var rpmIn = num(form,'motor_rpm'), rr = num(form,'ratio') || 1; var out = rpmIn / rr; r = [add('Redüktör çıkış devri', out, 'rpm', ''), add('Çıkış açısal hızı', out*6, 'derece/sn', '')]; break; } case 'reduktor-cikis-torku-hesabi': { var mt = num(form,'motor_torque_nm'), rr2 = num(form,'ratio') || 1, effr = num(form,'efficiency')/100; var outTorque = mt * rr2 * effr; r = [add('Yaklaşık çıkış torku', outTorque, 'Nm', ''), add('Yaklaşık çıkış torku', outTorque*10.1972, 'kgf·cm', '')]; break; } case 'reduktor-kayis-kasnak-hiz-hesabi': { var mr = num(form,'motor_rpm'), rr3 = num(form,'ratio') || 1, dia = num(form,'pulley_diameter_mm'); var outRpm = mr / rr3; var circ = PI * dia; var mmMin = outRpm * circ; r = [add('Kasnak çıkış devri', outRpm, 'rpm', ''), add('Teorik lineer hız', mmMin, 'mm/dk', ''), add('Teorik lineer hız', mmMin/1000, 'm/dk', ''), add('Teorik lineer hız', mmMin/60000, 'm/sn', '')]; break; } case 'step-motor-surucu-pulse-hesabi': { var spm = num(form,'steps_per_mm'), ts = num(form,'target_speed'); var hz = spm * ts / 60; r = [add('Gerekli pulse frekansı', hz, 'Hz', ''), add('Gerekli pulse frekansı', hz/1000, 'kHz', 'Kontrol kartı ve sürücü bu frekansı desteklemeli')]; break; } case 'step-motor-guc-kaynagi-hesabi': { var count = num(form,'motor_count'), cur = num(form,'driver_current'), sim = num(form,'simultaneous_percent')/100, margin = num(form,'margin_percent')/100, volt = num(form,'voltage'); var amps = count * cur * sim * (1 + margin); r = [add('Önerilen güç kaynağı akımı', amps, 'A', 'Yaklaşık ön seçim değeri'), add('Önerilen güç kaynağı gücü', amps*volt, 'W', ''), add('Önerilen güç kaynağı gücü', amps*volt/1000, 'kW', '')]; break; } case 'servo-motor-guc-tork-hesabi': { var torque = num(form,'torque_nm'), rpm = num(form,'rpm'); var kw = torque * rpm / 9550; r = [add('Yaklaşık mekanik güç', kw, 'kW', ''), add('Yaklaşık mekanik güç', kw*1000, 'W', '')]; break; } case 'servo-motor-tork-hesabi': { var pkw = num(form,'power_kw'), rpm2 = num(form,'rpm') || 1; var tq = 9550 * pkw / rpm2; r = [add('Yaklaşık tork', tq, 'Nm', ''), add('Yaklaşık tork', tq*10.1972, 'kgf·cm', '')]; break; } case 'servo-enkoder-cozunurluk-hesabi': { var ppr = num(form,'encoder_ppr'), quad = num(form,'quadrature') || 1, ratio6 = num(form,'ratio') || 1, lead6 = num(form,'lead_mm') || 1; var countsRev = ppr * quad; var countsMm = countsRev * ratio6 / lead6; r = [add('Tur başına sayım', countsRev, 'count/tur', ''), add('Lineer çözünürlük', countsMm, 'count/mm', ''), add('Bir count ile teorik hareket', 1/countsMm, 'mm', ''), add('Bir count ile teorik hareket', (1/countsMm)*1000, 'mikron', '')]; break; } case 'spindle-devir-hesabi': { var vcBase = num(form,'material_vc') || 350; var d = num(form,'tool_diameter_mm') || 1; var fl = num(form,'flute_count') || 1; var pr = num(form,'priority_factor') || 1; var mq = num(form,'machine_quality') || 1; var op = num(form,'operation_factor') || 1; var maxR = num(form,'max_spindle_rpm') || 24000; var rpmNeed = (vcBase * pr * 1000) / (PI * d); var rpmLimited = Math.min(rpmNeed, maxR); var chip = Math.max(0.015, Math.min(0.14, d * 0.008 * pr * mq * op)); var feed = rpmLimited * fl * chip; r = [add('Hesaplanan hedef spindle devri', rpmNeed, 'rpm', rpmNeed>maxR?'Spindle maksimum devrini aşıyor; sınırlı değerle başlayın':'Başlangıç devir değeri'), add('Kullanılabilir başlangıç devri', rpmLimited, 'rpm', ''), add('Önerilen başlangıç F', feed, 'mm/dk', 'Makine kalitesi ve öncelik dahil'), add('Tahmini talaş yükü', chip, 'mm/diş', '')]; break; } case 'spindle-kesme-hizi-hesabi': { var srpm = num(form,'rpm'), td = num(form,'tool_diameter_mm'); var speed = PI * td * srpm / 1000; r = [add('Kesme hızı', speed, 'm/dk', ''), add('Kesme hızı', speed/60, 'm/sn', '')]; break; } case 'freze-ilerleme-hizi-hesabi': { var frpm = num(form,'rpm'), flutes = num(form,'flute_count'), chip = num(form,'chipload'); var feed = frpm * flutes * chip; r = [add('Önerilen başlangıç ilerleme hızı', feed, 'mm/dk', ''), add('Önerilen başlangıç ilerleme hızı', feed/1000, 'm/dk', ''), add('Bir devirde ilerleme', flutes*chip, 'mm/tur', '')]; break; } case 'spindle-guc-tahmini-hesabi': { var phase = form.elements['phase_type'] ? form.elements['phase_type'].value : 'three'; var v = num(form,'voltage'), i = num(form,'current'), pf = num(form,'power_factor'), ef = num(form,'efficiency')/100; var electrical = (phase === 'three') ? SQRT3 * v * i * pf : v * i * pf; var shaft = electrical * ef; r = [add('Yaklaşık elektriksel güç', electrical/1000, 'kW', ''), add('Yaklaşık mile aktarılan güç', shaft/1000, 'kW', 'Verim hesaba katılmış tahmini değer'), add('Yaklaşık mile aktarılan güç', shaft, 'W', '')]; break; } case 'lineer-hareket-ivme-kuvvet-hesabi': { var m = num(form,'mass_kg'), a = num(form,'acceleration'), friction = num(form,'friction_n'), saf = num(form,'safety_percent')/100; var baseF = m * a + friction; var totalF = baseF * (1 + saf); r = [add('Emniyet paysız kuvvet', baseF, 'N', ''), add('Emniyet paylı hedef kuvvet', totalF, 'N', ''), add('Emniyet paylı hedef kuvvet', totalF/KGF, 'kgf', '')]; break; } case 'kayis-kasnak-cozunurluk-hesabi': { var teeth = num(form,'pulley_teeth'), pitch = num(form,'belt_pitch'), st = num(form,'motor_steps'), ms = num(form,'microstep') || 1, rt = num(form,'ratio') || 1; var mmRev = teeth * pitch / rt; var stepsMm = st * ms / mmRev; r = [add('Bir motor turunda lineer hareket', mmRev, 'mm', ''), add('Kontrol ayarı', stepsMm, 'step/mm', ''), add('Bir pulse ile teorik hareket', 1/stepsMm, 'mm', ''), add('Bir pulse ile teorik hareket', (1/stepsMm)*1000, 'mikron', '')]; break; } case 'step-motor-guc-hesaplama': { var torqueSm = num(form,'torque_nm'), rpmSm = num(form,'rpm'), safetySm = num(form,'safety_percent')/100; var kwSm = torqueSm * rpmSm / 9550; r = [add('Yaklaşık mekanik güç', kwSm*1000, 'W', ''), add('Yaklaşık mekanik güç', kwSm, 'kW', ''), add('Emniyet paylı seçim gücü', kwSm*(1+safetySm)*1000, 'W', 'Pratik motor seçimi için artırılmış değer')]; break; } case 'guc-kaynagi-hesaplama': { var countG = num(form,'motor_count'), curG = num(form,'driver_current'), simG = num(form,'simultaneous_percent')/100, marginG = num(form,'margin_percent')/100, voltG = num(form,'voltage'); var ampsG = countG * curG * simG * (1 + marginG); r = [add('Önerilen güç kaynağı akımı', ampsG, 'A', 'Yaklaşık ön seçim değeri'), add('Önerilen güç kaynağı gücü', ampsG*voltG, 'W', ''), add('Önerilen güç kaynağı gücü', ampsG*voltG/1000, 'kW', '')]; break; } case 'spindle-motor-kw-hesaplama': { var dep = num(form,'depth_mm'), wid = num(form,'width_mm'), feedS = num(form,'feed_mm_min'), mf = num(form,'material_factor') || 1, mm = num(form,'machine_margin')/100; var mrr = dep * wid * feedS / 1000; var kwNeed = mrr * mf / 60 / 100; r = [add('Talaş kaldırma hacmi', mrr, 'cm³/dk', ''), add('Yaklaşık güç ihtiyacı', kwNeed, 'kW', 'Kaba malzeme katsayılı tahmin'), add('Emniyet paylı önerilen güç', kwNeed*(1+mm), 'kW', 'Bir üst spindle sınıfı değerlendirilebilir')]; break; } case 'talas-yuku-hesaplama': { var feedT = num(form,'feed_mm_min'), rpmT = num(form,'rpm') || 1, flT = num(form,'flute_count') || 1; var chipT = feedT / rpmT / flT; r = [add('Talaş yükü', chipT, 'mm/diş', 'Diş başına ilerleme'), add('Bir devirde ilerleme', chipT*flT, 'mm/tur', '')]; break; } case 'spindle-tork-hesaplama': { var spKw = num(form,'power_kw'), spRpm = num(form,'rpm') || 1; var spTq = 9550 * spKw / spRpm; r = [add('Yaklaşık spindle torku', spTq, 'Nm', ''), add('Yaklaşık spindle torku', spTq*10.1972, 'kgf·cm', '')]; break; } case 'kremayer-hiz-hesaplama': { var krpm = num(form,'motor_rpm'), krat = num(form,'ratio') || 1, mod = num(form,'module'), teethK = num(form,'teeth'); var pitchDia = mod * teethK; var outK = krpm / krat; var travelRev = PI * pitchDia; var speedK = outK * travelRev; r = [add('Pinyon bölüm çapı', pitchDia, 'mm', ''), add('Pinyon bir tur ilerleme', travelRev, 'mm/tur', ''), add('Redüktör çıkış devri', outK, 'rpm', ''), add('Teorik eksen hızı', speedK, 'mm/dk', ''), add('Teorik eksen hızı', speedK/1000, 'm/dk', '')]; break; } case 'kremayer-itme-kuvveti-hesaplama': { var ktq = num(form,'motor_torque_nm'), krat2 = num(form,'ratio') || 1, keff = num(form,'efficiency')/100, kd = num(form,'pinion_diameter_mm')/1000; var outTqK = ktq * krat2 * keff; var forceK = kd > 0 ? outTqK / (kd/2) : 0; r = [add('Redüktör çıkış torku', outTqK, 'Nm', ''), add('Teorik itme kuvveti', forceK, 'N', ''), add('Teorik itme kuvveti', forceK/KGF, 'kgf', '')]; break; } case 'pinyon-cap-hesaplama': { var modP = num(form,'module'), teethP = num(form,'teeth'); var diaP = modP * teethP; r = [add('Pinyon bölüm dairesi çapı', diaP, 'mm', ''), add('Bir turdaki teorik ilerleme', PI*diaP, 'mm/tur', ''), add('Yarıçap', diaP/2, 'mm', '')]; break; } case 'planet-reduktor-guc-hiz-hesaplama': { var prpm = num(form,'motor_rpm'), ptq = num(form,'motor_torque_nm'), pr = num(form,'ratio') || 1, pe = num(form,'efficiency')/100; var poutRpm = prpm / pr; var poutTq = ptq * pr * pe; var pkw = poutTq * poutRpm / 9550; r = [add('Çıkış devri', poutRpm, 'rpm', ''), add('Çıkış torku', poutTq, 'Nm', ''), add('Çıkış mekanik gücü', pkw, 'kW', 'Verim sonrası yaklaşık değer')]; break; } case 'vidali-mil-guc-hesaplama': { var fkg = num(form,'force_kgf'), vmm = num(form,'speed_mm_min'), veff = num(form,'efficiency')/100, vsafe = num(form,'safety_percent')/100; var fn = fkg * KGF; var ms = vmm / 60000; var mechW = fn * ms; var inputW = veff > 0 ? mechW / veff : 0; r = [add('Saf mekanik güç', mechW, 'W', ''), add('Verim sonrası motor tarafı güç', inputW, 'W', ''), add('Emniyet paylı önerilen güç', inputW*(1+vsafe), 'W', '')]; break; } case 'mach3-steps-per-unit-hesaplama': case 'ddcs-pulse-mm-hesaplama': { var mst = num(form,'motor_steps'), mmic = num(form,'microstep') || 1, mrat = num(form,'ratio') || 1, mlead = num(form,'lead_mm') || 1; var mspm = mst * mmic * mrat / mlead; r = [add('Kontrol ayarı', mspm, 'pulse/mm', 'Başlangıç değeri'), add('Bir pulse ile teorik hareket', 1/mspm, 'mm', ''), add('Bir pulse ile teorik hareket', (1/mspm)*1000, 'mikron', '')]; break; } case 'inverter-guc-hesaplama': { var ikw = num(form,'motor_kw'), iload = num(form,'load_percent')/100, imar = num(form,'margin_percent')/100; var inv = ikw * iload * (1 + imar); r = [add('Hesaplanan inverter kapasitesi', inv, 'kW', 'Bir üst standart sınıf seçilebilir'), add('Yaklaşık W karşılığı', inv*1000, 'W', '')]; break; } case 'kablo-kesiti-hesaplama': { var kc = num(form,'current'), kl = num(form,'length_m'), kv = num(form,'voltage'), kd = num(form,'drop_percent')/100; var rho = 0.0175; var maxDrop = kv * kd; var section = maxDrop > 0 ? (2 * rho * kl * kc) / maxDrop : 0; r = [add('İzin verilen gerilim düşümü', maxDrop, 'V', ''), add('Yaklaşık minimum bakır kesit', section, 'mm²', 'Pratikte bir üst standart kesit seçilir')]; break; } case 'sigorta-salter-hesaplama': { var ph = form.elements['phase_type'] ? form.elements['phase_type'].value : 'single'; var skw = num(form,'power_kw'), sv = num(form,'voltage') || 1, spf = num(form,'power_factor') || 1, smar = num(form,'margin_percent')/100; var amp = (ph === 'three') ? (skw*1000)/(SQRT3*sv*spf) : (skw*1000)/(sv*spf); r = [add('Yaklaşık çalışma akımı', amp, 'A', ''), add('Emniyet paylı akım', amp*(1+smar), 'A', 'Sigorta ön seçimi için başlangıç')]; break; } case 'vakum-tutma-kuvveti-hesaplama': { var area = num(form,'area_cm2')/10000, vkpa = num(form,'vacuum_kpa')*1000, leak = num(form,'leak_percent')/100; var vf = area * vkpa * (1-leak); r = [add('Pratik tahmini tutma kuvveti', vf, 'N', 'Kaçak düşülmüş yaklaşık değer'), add('Pratik tahmini tutma kuvveti', vf/KGF, 'kgf', '')]; break; } case 'kesim-suresi-hesaplama': { var pathM = num(form,'toolpath_m'), feedC = num(form,'feed_mm_min') || 1, pass = num(form,'pass_count') || 1, loss = num(form,'loss_percent')/100, extra = num(form,'extra_min'); var baseMin = (pathM*1000/feedC) * pass; var totalMin = baseMin * (1+loss) + extra; r = [add('Teorik kesim süresi', baseMin, 'dk', ''), add('Kayıp ve hazırlık dahil süre', totalMin, 'dk', ''), add('Saat karşılığı', totalMin/60, 'saat', '')]; break; } case 'parca-basi-maliyet-hesaplama': { var mh = num(form,'machine_hour_cost'), oh = num(form,'operator_hour_cost'), jm = num(form,'job_minutes'), mat = num(form,'material_cost'), tool = num(form,'tool_cost'), scrap = num(form,'scrap_percent')/100, pc = num(form,'part_count') || 1; var labor = (mh+oh) * jm / 60; var total = (labor + mat + tool) * (1+scrap); r = [add('Toplam taban maliyet', total, 'TL', ''), add('Parça başı taban maliyet', total/pc, 'TL/adet', 'Kâr ve vergi eklenmeden')]; break; } case 'elektrik-tuketimi-hesaplama': { var sk = num(form,'spindle_kw'), vk = num(form,'vacuum_kw'), ak = num(form,'axis_kw'), hrs = num(form,'hours'), price = num(form,'price_kwh'); var kwh = (sk+vk+ak)*hrs; r = [add('Toplam tüketim', kwh, 'kWh', ''), add('Yaklaşık elektrik maliyeti', kwh*price, 'TL', '')]; break; } case 'paso-sayisi-hesaplama': { var th = num(form,'thickness_mm'), dp = num(form,'depth_per_pass_mm') || 1, fin = num(form,'finish_allowance_mm'); var rough = Math.max(th - fin, 0); var passes = Math.ceil(rough / dp) + (fin > 0 ? 1 : 0); r = [add('Kaba paso sayısı', Math.ceil(rough/dp), 'adet', ''), add('Toplam paso sayısı', passes, 'adet', fin > 0 ? 'Son temizlik pasosu dahil' : '')]; break; } case 'lineer-kizak-yuk-hesaplama': { var loadKg = num(form,'load_kg'), carCount = num(form,'car_count') || 1, dyn = num(form,'dynamic_factor') || 1, sf = num(form,'safety_percent')/100; var perKg = loadKg / carCount; var designKg = perKg * dyn * (1 + sf); r = [add('Araba başına statik yük', perKg, 'kg', ''), add('Araba başına seçim yükü', designKg, 'kg', 'Dinamik katsayı ve emniyet payı dahil'), add('Araba başına seçim yükü', designKg*KGF, 'N', '')]; break; } case 'lineer-araba-yuk-dagilimi-hesaplama': { var lkg = num(form,'load_kg'), oh = num(form,'overhang_mm')/1000, spacing = num(form,'car_spacing_mm')/1000, cc = num(form,'car_count') || 1; var f = lkg * KGF; var moment = f * oh; var extra = spacing > 0 ? moment / spacing : 0; var avg = f / cc; var design = avg + extra / Math.max(cc/2,1); r = [add('Yaklaşık moment', moment, 'Nm', ''), add('Ortalama araba yükü', avg, 'N', ''), add('Moment etkili tahmini kritik yük', design, 'N', 'En çok yük alan araba için kaba tahmin'), add('Moment etkili tahmini kritik yük', design/KGF, 'kgf', '')]; break; } case 'krom-mil-sehim-hesaplama': { var lk = num(form,'load_kg'), span = num(form,'span_mm'), d = num(form,'diameter_mm'), sup = num(form,'support_factor') || 1; var E = 210000, F = lk * KGF, I = PI * Math.pow(d,4) / 64; var defl = I > 0 ? (F * Math.pow(span,3) / (48 * E * I)) * sup : 0; r = [add('Yaklaşık sehim', defl, 'mm', 'Basit kiriş yaklaşımı'), add('Mil atalet momenti', I, 'mm⁴', '')]; break; } case 'sigma-profil-agirlik-hesaplama': { var kgm = num(form,'kg_per_m'), len = num(form,'length_m'), cnt = num(form,'count') || 1; var total = kgm * len * cnt; r = [add('Tek parça ağırlığı', kgm*len, 'kg', ''), add('Toplam profil ağırlığı', total, 'kg', '')]; break; } case 'sigma-profil-kesim-olcusu-hesaplama': { var outer = num(form,'outer_mm'), allow = num(form,'allowance_each_mm'), cntp = num(form,'count') || 1; var cut = Math.max(outer - 2*allow, 0); r = [add('Tek parça kesim boyu', cut, 'mm', ''), add('Toplam kesim uzunluğu', cut*cntp/1000, 'm', '')]; break; } case 'sigma-profil-sehim-yaklasik-hesaplama': { var pload = num(form,'load_kg'), pspan = num(form,'span_mm'), icm4 = num(form,'inertia_cm4'), psup = num(form,'support_factor') || 1; var Eal = 70000, Iprof = icm4 * 10000, Fp = pload * KGF; var pdef = Iprof > 0 ? (Fp * Math.pow(pspan,3) / (48 * Eal * Iprof)) * psup : 0; r = [add('Yaklaşık profil sehimi', pdef, 'mm', ''), add('Kullanılan atalet momenti', Iprof, 'mm⁴', '')]; break; } case 'kaplin-tork-hesaplama': { var ckw = num(form,'power_kw'), crpm = num(form,'rpm') || 1, csafe = num(form,'safety_percent')/100; var ct = 9550 * ckw / crpm; r = [add('Çalışma torku', ct, 'Nm', ''), add('Emniyet paylı kaplin torku', ct*(1+csafe), 'Nm', 'Kaplin kapasitesi için başlangıç'), add('Emniyet paylı kaplin torku', ct*(1+csafe)*10.1972, 'kgf·cm', '')]; break; } case 'triger-kayis-uzunlugu-hesaplama': { var C = num(form,'center_mm'), t1 = num(form,'teeth1'), t2 = num(form,'teeth2'), pitch = num(form,'pitch_mm'); var D1 = (t1*pitch)/PI, D2 = (t2*pitch)/PI; var L = 2*C + (PI/2)*(D1+D2) + (Math.pow(D2-D1,2)/(4*C || 1)); r = [add('Yaklaşık kayış boyu', L, 'mm', 'En yakın standart kayış seçilir'), add('Yaklaşık kayış diş sayısı', L/pitch, 'diş', ''), add('Birinci kasnak bölüm çapı', D1, 'mm', ''), add('İkinci kasnak bölüm çapı', D2, 'mm', '')]; break; } case 'kasnak-oran-hesaplama': { var mr = num(form,'motor_rpm'), dt = num(form,'driver_teeth') || 1, drt = num(form,'driven_teeth') || 1, effo = num(form,'efficiency')/100; var ratio = drt / dt; var out = mr / ratio; r = [add('Aktarma oranı', ratio, ':1', 'Çıkış kasnağı / motor kasnağı'), add('Çıkış devri', out, 'rpm', ''), add('Yaklaşık tork çarpanı', ratio*effo, 'kat', 'Verim sonrası')]; break; } case 'rulman-omur-hesaplama': { var Ckn = num(form,'c_kn'), Pkn = num(form,'p_kn') || 0.001, rrpm = num(form,'rpm') || 1; var L10 = Math.pow(Ckn/Pkn, 3); var hours = L10 * 1000000 / (60 * rrpm); r = [add('L10 temel ömür', L10, 'milyon devir', ''), add('Yaklaşık çalışma ömrü', hours, 'saat', 'Sabit yük varsayımıyla'), add('Yaklaşık çalışma ömrü', hours/24, 'gün', '')]; break; } case 'pnomatik-silindir-kuvvet-hesaplama': { var cd = num(form,'diameter_mm')/1000, rod = num(form,'rod_mm')/1000, bar = num(form,'pressure_bar'), ce = num(form,'efficiency')/100; var P = bar * 100000, areaPush = PI*Math.pow(cd,2)/4, areaRod = PI*Math.pow(rod,2)/4; var push = P * areaPush * ce, pull = P * Math.max(areaPush-areaRod,0) * ce; r = [add('İtme kuvveti', push, 'N', ''), add('İtme kuvveti', push/KGF, 'kgf', ''), add('Çekme kuvveti', pull, 'N', 'Mil alanı düşülmüş'), add('Çekme kuvveti', pull/KGF, 'kgf', '')]; break; } case 'kompresor-debi-hesaplama': { var kd = num(form,'diameter_mm')/1000, stroke = num(form,'stroke_mm')/1000, cyc = num(form,'cycle_min'), kc = num(form,'count') || 1, kb = num(form,'pressure_bar'), lossK = num(form,'loss_percent')/100; var vol = PI*Math.pow(kd,2)/4*stroke; // m3 one stroke var freeLm = vol*2*cyc*kc*(kb+1)*1000*(1+lossK); r = [add('Yaklaşık serbest hava ihtiyacı', freeLm, 'L/dk', 'İleri-geri çevrim dahil'), add('Saatlik hava ihtiyacı', freeLm*60, 'L/saat', '')]; break; } case 'atc-hava-tuketimi-hesaplama': { var ch = num(form,'changes_hour'), apl = num(form,'air_per_change_l'), aloss = num(form,'loss_percent')/100; var lh = ch * apl * (1+aloss); r = [add('Saatlik hava tüketimi', lh, 'L/saat', ''), add('Ortalama hava ihtiyacı', lh/60, 'L/dk', '')]; break; } case 'vakum-pompasi-guc-hesaplama': { var flow = num(form,'flow_m3h'), vac = num(form,'vacuum_kpa')*1000, ve = num(form,'efficiency')/100, vs = num(form,'safety_percent')/100; var q = flow / 3600; var airKw = q * vac / 1000; var motorKw = ve > 0 ? airKw / ve * (1+vs) : 0; r = [add('Teorik hava gücü', airKw, 'kW', ''), add('Verim ve pay dahil motor gücü', motorKw, 'kW', 'Yaklaşık ön seçim')]; break; } case 'blower-debi-hesaplama': { var za = num(form,'zone_area_m2'), leakRate = num(form,'leak_m3h_m2'), oz = num(form,'open_zones') || 1, bs = num(form,'safety_percent')/100; var req = za * leakRate * oz * (1+bs); r = [add('Önerilen minimum debi', req, 'm³/h', 'Kaçak ve emniyet payı dahil'), add('Dakika karşılığı', req/60, 'm³/dk', '')]; break; } case 'vfd-frekans-devir-hesaplama': { var hz = num(form,'frequency_hz'), poles = num(form,'poles') || 2, slip = num(form,'slip_percent')/100; var sync = 120 * hz / poles; var actual = sync * (1-slip); r = [add('Senkron devir', sync, 'rpm', ''), add('Kayma sonrası yaklaşık devir', actual, 'rpm', '')]; break; } case 'motor-akim-guc-hesaplama': { var mphase = form.elements['phase_type'] ? form.elements['phase_type'].value : 'three'; var mv = num(form,'voltage'), mi = num(form,'current'), mpf = num(form,'power_factor') || 1, meff = num(form,'efficiency')/100; var elW = (mphase === 'three') ? SQRT3*mv*mi*mpf : mv*mi*mpf; r = [add('Yaklaşık elektriksel güç', elW/1000, 'kW', ''), add('Yaklaşık mekanik güç', elW*meff/1000, 'kW', 'Verim sonrası')]; break; } case 'cnc-router-motor-secim-on-kontrol': { var rm = num(form,'mass_kg'), rv = num(form,'speed_mm_min')/60000, ra = num(form,'acceleration'), rf = num(form,'friction_n'), re = num(form,'efficiency')/100, rs = num(form,'safety_percent')/100; var forceR = (rm*ra + rf) * (1+rs); var powerR = re > 0 ? (forceR * rv) / re : 0; r = [add('Emniyet paylı hedef kuvvet', forceR, 'N', ''), add('Emniyet paylı hedef kuvvet', forceR/KGF, 'kgf', ''), add('Yaklaşık mekanik güç ihtiyacı', powerR, 'W', 'Aktarma verimi dahil')]; break; } case 'mdf-kesim-parametre-hesaplama': case 'aluminyum-kesim-parametre-hesaplama': case 'pleksi-kesim-parametre-hesaplama': { var crpm2 = num(form,'rpm'), cfl = num(form,'flute_count') || 1, cchip = num(form,'chipload'), cpass = num(form,'pass_depth_mm'); var feed = crpm2 * cfl * cchip; r = [add('Başlangıç ilerleme hızı', feed, 'mm/dk', ''), add('Başlangıç ilerleme hızı', feed/1000, 'm/dk', ''), add('Girilen paso derinliği', cpass, 'mm', 'Makine rijitliğiyle kontrol edin')]; break; } case 'ic-kose-radyus-hesaplama': { var td = num(form,'tool_diameter_mm'), fa = num(form,'finish_allowance_mm'); var rad = td/2 + fa; r = [add('Minimum iç köşe radyüsü', rad, 'mm', ''), add('Takım yarıçapı', td/2, 'mm', '')]; break; } case 'takim-cikma-orani-hesaplama': { var td2 = num(form,'tool_diameter_mm') || 1, so = num(form,'stickout_mm'); var ld = so / td2; r = [add('Çıkma oranı L/D', ld, 'kat', ''), add('Pens dışı uzunluk', so, 'mm', ld > 4 ? 'Yüksek titreşim riski olabilir' : 'Daha kontrollü aralık')]; break; } case 'z-ekseni-fren-torku-hesaplama': { var zl = num(form,'load_kg'), zlead = num(form,'lead_mm')/1000, zratio = num(form,'ratio') || 1, zeff = num(form,'efficiency')/100, zsafe = num(form,'safety_percent')/100; var zforce = zl * KGF; var zt = (zforce * zlead) / (2*PI*zratio*Math.max(zeff,0.001)); r = [add('Teorik tutma torku', zt, 'Nm', ''), add('Emniyet paylı fren torku', zt*(1+zsafe), 'Nm', 'Fren seçimi için'), add('Emniyet paylı fren torku', zt*(1+zsafe)*10.1972, 'kgf·cm', '')]; break; } case 'spindle-sogutma-suyu-hacmi-hesaplama': { var sw = num(form,'spindle_kw'), loadp = num(form,'load_percent')/100, heatp = num(form,'heat_percent')/100, tm = num(form,'time_min'), tr = num(form,'temp_rise_c') || 1; var heatW = sw*1000*loadp*heatp; var joule = heatW*tm*60; var liters = joule/(4186*tr); r = [add('Suya aktarılan yaklaşık ısı', heatW, 'W', ''), add('Minimum teorik su hacmi', liters, 'L', 'Radyatör veya chiller olmadan'), add('Emniyetli pratik hacim', liters*2, 'L', 'Yaklaşık iki kat pay')]; break; } case 'cnc-router-makine-konfiguratoru': { var size = num(form,'machine_size_factor'), mat = num(form,'material_factor'), body = num(form,'body_factor'), motor = num(form,'motor_factor'), sp = num(form,'spindle_kw'), vac = num(form,'vacuum_table'), atc = num(form,'atc'), pri = num(form,'priority'); var score = size*18 + mat*16 + body*18 + motor*10 + sp*5 + vac*8 + atc*10 + pri*8; var classHint = score < 95 ? 'Hafif/orta sınıf; ekonomik veya standart üretim için' : (score < 140 ? 'Orta-ağır sınıf; servo ve güçlü gövde önerilir' : 'Ağır sanayi sınıfı; servo + redüktör, güçlü vakum ve rijit gövde gerekli'); var recSp = Math.max(sp, mat >= 4 ? 6 : (size >= 3 ? 4.5 : 2.2)); r = [add('Makine ihtiyaç puanı', score, 'puan', classHint), add('Önerilen minimum spindle sınıfı', recSp, 'kW', ''), add('Vakum / ATC donanım puanı', vac*8 + atc*10, 'puan', 'Donanım karmaşıklığı')]; break; } case 'cnc-eksen-motor-secim-sihirbazi': { var mE = num(form,'mass_kg'), vE = num(form,'target_speed')/60000, aE = num(form,'acceleration'), fE = num(form,'friction_n'), radE = num(form,'drive_radius_mm')/1000, ratioE = num(form,'ratio') || 1, effE = Math.max(num(form,'efficiency')/100,0.001), safeE = num(form,'safety_percent')/100; var forceE = (mE*aE + fE) * (1+safeE); var motorTorqueE = forceE * radE / (ratioE * effE); var circE = 2*PI*radE*1000; var outRpmE = circE > 0 ? num(form,'target_speed') / circE : 0; var motorRpmE = outRpmE * ratioE; r = [add('Emniyet paylı eksen kuvveti', forceE, 'N', ''), add('Gerekli yaklaşık motor torku', motorTorqueE, 'Nm', motorRpmE > 1000 ? 'Bu devir step motor için dikkat ister' : ''), add('Gerekli motor devri', motorRpmE, 'rpm', ''), add('Yaklaşık mekanik güç', forceE*vE/effE, 'W', '')]; break; } case 'servo-atalet-uyumluluk-hesabi': { var lm = num(form,'load_kg'), rrmm = num(form,'radius_mm')/1000, rg = num(form,'ratio') || 1, miKgcm = num(form,'motor_inertia_kgcm2'), acc = num(form,'target_acceleration'); var loadJ = lm * rrmm * rrmm; var reflected = loadJ / (rg*rg); var motorJ = miKgcm * 0.0001; var ratioJ = motorJ > 0 ? reflected / motorJ : 0; var accTorque = reflected * (rrmm > 0 ? acc/rrmm : 0); r = [add('Yük ataleti', loadJ, 'kg·m²', ''), add('Motora yansıyan atalet', reflected, 'kg·m²', ''), add('Atalet oranı', ratioJ, ':1', ratioJ > 10 ? 'Yüksek; tuning zorlaşabilir' : (ratioJ > 5 ? 'Sınırda; kontrol edin' : 'Daha rahat ayarlanabilir')), add('Yaklaşık ivme torku etkisi', accTorque, 'Nm', '')]; break; } case 'cnc-router-maksimum-hiz-hesaplama': { var mrpm = num(form,'motor_rpm'), mmrev = num(form,'motion_per_rev'), rat = num(form,'ratio') || 1, spmm = num(form,'steps_per_mm') || 1, khz = num(form,'card_khz'); var mech = mrpm/rat*mmrev; var pulseLimit = khz*1000*60/spmm; r = [add('Mekanik maksimum hız', mech, 'mm/dk', 'Motor ve aktarma sınırı'), add('Pulse sınırına göre maksimum hız', pulseLimit, 'mm/dk', 'Kontrol kartı sınırı'), add('Kullanılabilir teorik üst sınır', Math.min(mech,pulseLimit), 'mm/dk', mech < pulseLimit ? 'Darboğaz mekanik/motor tarafı' : 'Darboğaz pulse/kontrol kartı tarafı')]; break; } case 'kontrol-karti-pulse-siniri-hesaplama': { var sppm = num(form,'steps_per_mm'), tv = num(form,'target_speed'), ck = num(form,'card_khz'), micro = num(form,'microstep'); var needKhz = sppm * tv / 60 / 1000; var maxSpeed = sppm > 0 ? ck*1000*60/sppm : 0; var reserve = needKhz > 0 ? (ck-needKhz)/needKhz*100 : 0; r = [add('Gerekli pulse frekansı', needKhz, 'kHz', ''), add('Kart sınırına göre maksimum hız', maxSpeed, 'mm/dk', ''), add('Frekans rezervi', reserve, '%', reserve < 20 ? 'Sınırda veya yetersiz olabilir' : 'Daha güvenli aralık')]; break; } case 'spindle-inverter-uyum-sihirbazi': { var skw = num(form,'spindle_kw'), sv = num(form,'spindle_voltage'), sup = num(form,'supply_type'), pf = num(form,'power_factor') || 1, ef = Math.max(num(form,'efficiency')/100,0.001), len = num(form,'cable_length_m'), saf = num(form,'safety_percent')/100; var current = sup === 3 ? (skw*1000/(SQRT3*sv*pf*ef)) : (skw*1000/(sv*pf*ef)); var inv = skw*(1+saf); var cable = current <= 10 ? 1.5 : (current <= 18 ? 2.5 : (current <= 26 ? 4 : (current <= 34 ? 6 : 10))); r = [add('Önerilen minimum inverter gücü', inv, 'kW', 'Bir üst standart sınıf seçilebilir'), add('Yaklaşık çalışma akımı', current, 'A', ''), add('Ön kablo kesiti sınıfı', cable, 'mm²', len > 20 ? 'Uzun kabloda gerilim düşümü ayrıca kontrol edilmeli' : '')]; break; } case 'spindle-pens-takim-uyum-rehberi': { var col = num(form,'collet_max_mm'), tool = num(form,'tool_diameter_mm'), rpmP = num(form,'rpm'), stick = num(form,'stickout_mm'); var margin = col - tool; var vcP = PI*tool*rpmP/1000; var ldP = tool > 0 ? stick/tool : 0; r = [add('Pens çap rezervi', margin, 'mm', margin < 1 ? 'Sınırda; daha büyük pens sistemi gerekebilir' : 'Uygun aralık'), add('Kesme hızı', vcP, 'm/dk', ''), add('Takım çıkma oranı', ldP, 'L/D', ldP > 4 ? 'Titreşim riski yüksek' : 'Daha kontrollü aralık')]; break; } case 'gelismis-talas-yuku-hesaplama': { var mf = num(form,'material_factor'), td = num(form,'tool_diameter_mm'), fl = num(form,'flute_count') || 1, rpmG = num(form,'rpm') || 1, feedG = num(form,'feed_mm_min'), depG = num(form,'depth_mm'), widG = num(form,'width_mm'); var chipG = feedG/(rpmG*fl); var mrrG = depG*widG*feedG/1000; var riskG = (chipG/(td||1))*100*mf; r = [add('Hesaplanan talaş yükü', chipG, 'mm/diş', chipG < 0.02 ? 'Düşük; sürtme/yanma riski' : (chipG > 0.12 ? 'Yüksek; takım kırma riski' : 'Genel başlangıç aralığı')), add('Talaş kaldırma hacmi', mrrG, 'cm³/dk', ''), add('Kesim yükü risk skoru', riskG, 'puan', riskG > 3 ? 'Malzeme ve makine rijitliği kontrol edilmeli' : '')]; break; } case 'gelismis-cnc-kesim-suresi-hesaplama': { var cp = num(form,'cut_path_mm'), rp = num(form,'rapid_path_mm'), ff = num(form,'feed_mm_min')||1, rr0 = num(form,'rapid_mm_min')||1, holes = num(form,'hole_count'), sh = num(form,'sec_per_hole'), tc = num(form,'tool_changes'), stc = num(form,'sec_per_tool'), setup = num(form,'setup_min'), clean = num(form,'cleanup_min'); var cutMin = cp/ff; var rapidMin = rp/rr0; var extraMin = (holes*sh + tc*stc)/60; var total = cutMin + rapidMin + extraMin + setup + clean; r = [add('Net kesim süresi', cutMin, 'dk', ''), add('Gerçekçi toplam parça süresi', total, 'dk', ''), add('8 saatte yaklaşık kapasite', total > 0 ? 480/total : 0, 'adet', '')]; break; } case 'profesyonel-parca-basi-maliyet-hesaplama': { var matC = num(form,'material_cost'), waste = num(form,'waste_percent')/100, cyc = num(form,'cycle_min'), ekw = num(form,'electric_kw'), eprice = num(form,'electric_price'), oph = num(form,'operator_hour'), toolC = num(form,'tool_cost'), mach = num(form,'machine_hour'), overhead = num(form,'overhead_percent')/100, prof = num(form,'profit_percent')/100; var timeH = cyc/60; var base = matC*(1+waste) + ekw*timeH*eprice + oph*timeH + toolC + mach*timeH; var withOver = base*(1+overhead); var sale = withOver*(1+prof); r = [add('Net parça maliyeti', base, 'TL', ''), add('Genel gider dahil maliyet', withOver, 'TL', ''), add('Önerilen satış fiyatı', sale, 'TL', 'Hedef kâr dahil')]; break; } case 'vakum-tabla-blower-secim-sihirbazi': { var pw = num(form,'part_width_mm'), pl = num(form,'part_length_mm'), vk = num(form,'vacuum_kpa'), leak = num(form,'leak_percent')/100, cf = num(form,'cut_force_n'), zones = num(form,'zone_count'), mlf = num(form,'material_leak_factor'); var area = pw*pl/1000000; var theoretical = area*vk*1000; var practical = theoretical*Math.max(0,1-leak)/mlf; var margin = cf > 0 ? practical/cf : 0; r = [add('Parça vakum alanı', area, 'm²', ''), add('Pratik tutma kuvveti tahmini', practical, 'N', ''), add('Kesim kuvvetine karşı güvenlik oranı', margin, 'kat', margin < 2 ? 'Sınırda; kayma riski olabilir' : 'Daha güvenli aralık'), add('Bölge başına göreli blower ihtiyacı', zones*mlf/(Math.max(0.1,1-leak)), 'birim', '')]; break; } case 'toz-emme-talas-toplama-hesaplama': { var hd = num(form,'hose_diameter_mm')/1000, as = num(form,'air_speed_ms'), hl = num(form,'hose_length_m'), eb = num(form,'elbow_count'), df = num(form,'dust_factor'); var q = PI*Math.pow(hd/2,2)*as*3600; var loss = (hl*0.08 + eb*0.25)*df; r = [add('Gerekli hava debisi', q, 'm³/h', ''), add('Hortum/dirsek kayıp skoru', loss, 'puan', loss > 2 ? 'Direnç yüksek; çap ve hat kontrol edilmeli' : ''), add('Kayıp paylı debi hedefi', q*(1+loss/10), 'm³/h', '')]; break; } case 'lineer-kizak-araba-yuk-sihirbazi': { var load = num(form,'load_kg')*KGF, cars = num(form,'carriage_count')||1, mom = num(form,'moment_nm'), rail = num(form,'rail_spacing_mm')/1000, sf = num(form,'safety_percent')/100; var baseCar = load/cars; var momForce = rail > 0 ? mom/rail : 0; var totalCar = (baseCar + momForce/Math.max(1,cars/2))*(1+sf); r = [add('Statik araba başı yük', baseCar, 'N', ''), add('Momentten gelen ek kuvvet', momForce, 'N', ''), add('Emniyet paylı araba başı hedef', totalCar, 'N', '')]; break; } case 'vidali-mil-omur-burkulma-sihirbazi': { var d = num(form,'root_diameter_mm'), l = num(form,'length_mm'), loadK = num(form,'load_kgf'), rpmV = num(form,'rpm'), sfac = num(form,'support_factor'), safv = num(form,'safety_percent')/100; var din = d/25.4, lin = l/25.4; var crit = lin > 0 ? sfac*4.76e6*din/(lin*lin) : 0; var rpmMargin = rpmV > 0 ? crit/rpmV : 0; var buckScore = loadK*Math.pow(l/1000,2)/(Math.max(1,d*d))*(1+safv); r = [add('Yaklaşık kritik devir', crit, 'rpm', ''), add('Çalışma devrine güvenlik oranı', rpmMargin, 'kat', rpmMargin < 1.5 ? 'Kritik devire yakın' : 'Daha güvenli'), add('Burkulma risk skoru', buckScore, 'puan', buckScore > 2 ? 'Çap/yataklama kontrol edilmeli' : '')]; break; } case 'kremayer-pinyon-secim-sihirbazi': { var mod = num(form,'module'), teeth = num(form,'teeth'), ratioK = num(form,'ratio')||1, rpmK = num(form,'motor_rpm'), tqK = num(form,'motor_torque_nm'), massK = num(form,'mass_kg'), accK = num(form,'acceleration'), effK = num(form,'efficiency')/100; var pd = mod*teeth; var circ = PI*pd; var speedK = rpmK/ratioK*circ; var forceK = (tqK*ratioK*effK)/(Math.max(pd/2000,0.0001)); var needK = massK*accK; r = [add('Pinyon bölüm çapı', pd, 'mm', ''), add('Teorik eksen hızı', speedK, 'mm/dk', ''), add('Teorik itme kuvveti', forceK, 'N', ''), add('İvme için gereken kuvvet', needK, 'N', forceK < needK*1.5 ? 'Güvenlik payı düşük olabilir' : '')]; break; } case 'planet-reduktor-secim-araci': { var tq = num(form,'motor_torque_nm'), rpmR = num(form,'motor_rpm'), ratR = num(form,'ratio')||1, effR = num(form,'efficiency')/100, tt = num(form,'target_torque_nm'), tr = num(form,'target_rpm'); var outT = tq*ratR*effR; var outR = rpmR/ratR; r = [add('Redüktör çıkış torku', outT, 'Nm', outT >= tt ? 'Hedef torku karşılıyor' : 'Tork yetersiz'), add('Redüktör çıkış devri', outR, 'rpm', outR >= tr ? 'Hedef hızı karşılıyor' : 'Hız yetersiz'), add('Tork güvenlik oranı', tt>0 ? outT/tt : 0, 'kat', '')]; break; } case 'guc-panosu-toplam-elektrik-hesabi': { var totalKw = num(form,'spindle_kw')+num(form,'drive_kw')+num(form,'vacuum_kw')+num(form,'dust_kw')+num(form,'compressor_kw')+num(form,'aux_kw'); var sim = num(form,'simultaneous_percent')/100, ph = form.elements['phase_type'] ? form.elements['phase_type'].value : 'three', volt = num(form,'voltage'), pf2 = num(form,'power_factor')||1; var runKw = totalKw*sim; var amp = ph === 'three' ? runKw*1000/(SQRT3*volt*pf2) : runKw*1000/(volt*pf2); r = [add('Toplam kurulu güç', totalKw, 'kW', ''), add('Eş zamanlı tahmini güç', runKw, 'kW', ''), add('Tahmini ana akım', amp, 'A', ''), add('Ön sigorta sınıfı', amp*1.25, 'A', 'Bir üst standart değer seçilir')]; break; } case 'servo-fren-direnci-rejeneratif-hesabi': { var massF = num(form,'mass_kg'), speedF = num(form,'speed_mm_min')/60000, dt = num(form,'decel_time_s')||0.001, axis = num(form,'axis_type'), drop = num(form,'vertical_drop_mm')/1000, cyc = num(form,'cycles_per_min'), internal = num(form,'drive_internal_w'); var ke = 0.5*massF*speedF*speedF; var pe = axis === 1 ? massF*KGF*drop : 0; var energy = ke + pe; var peak = energy/dt; var avg = energy*cyc/60; r = [add('Frenleme enerjisi', energy, 'J', ''), add('Anlık frenleme gücü', peak, 'W', ''), add('Ortalama rejeneratif güç', avg, 'W', avg > internal ? 'Dahili kapasite aşılabilir' : 'Dahili kapasite içinde olabilir')]; break; } case 'atc-takim-degistirici-secim-araci': { var ch = num(form,'changes_per_day'), man = num(form,'manual_sec'), atc = num(form,'atc_sec'), tc0 = num(form,'tool_count'), air = num(form,'air_l_per_change'), dh = num(form,'daily_hours'); var saved = Math.max(0,(man-atc)*ch/60); var airTotal = ch*air; r = [add('Günlük zaman kazancı', saved, 'dk', ''), add('Günlük hava tüketimi', airTotal, 'L', ''), add('Çalışma saatine göre kazanç', dh>0 ? saved/dh : 0, 'dk/saat', ''), add('Gerekli takım magazin adedi', tc0, 'takım', '')]; break; } case 'kompresor-ihtiyaci-sihirbazi': { var apc = num(form,'air_per_cycle_l'), cpm = num(form,'cycles_per_min'), atcl = num(form,'atc_air_l_min'), safc = num(form,'safety_percent')/100, pb = num(form,'pressure_bar'); var need = (apc*cpm + atcl)*(1+safc); var tank = Math.max(25, need/10*pb); r = [add('Minimum serbest hava debisi', need, 'L/dk', ''), add('Önerilen pratik tank hacmi', tank, 'L', ''), add('Çalışma basıncı', pb, 'bar', 'Basınç düşümü izlenmeli')]; break; } case 'cnc-bakim-periyodu-hesaplayici': { var h = num(form,'daily_hours'), dust = num(form,'dust_level'), matB = num(form,'material_factor'), lub = num(form,'auto_lubrication'), drive = num(form,'drive_type'); var scoreB = h*dust*matB*lub*drive; var cleanDays = Math.max(1, Math.round(12/Math.max(1,scoreB))); var greaseDays = Math.max(1, Math.round(30/Math.max(1,scoreB/2))); r = [add('Bakım yoğunluk skoru', scoreB, 'puan', scoreB > 25 ? 'Ağır bakım şartı' : 'Normal kontrol aralığı'), add('Temizlik kontrol aralığı', cleanDays, 'gün', ''), add('Yağlama/kızak kontrol aralığı', greaseDays, 'gün', '')]; break; } case 'ariza-teshis-sihirbazi': { var pc = num(form,'problem_code'), rc = num(form,'recent_change'), temp = num(form,'motor_temp_c'), voltA = num(form,'supply_voltage'), msA = num(form,'microstep'); var risk = 30 + rc*15 + (temp>70?20:0) + (voltA<36?15:0) + (msA>16?10:0); var hint = 'İlk kontrol: kablo, ayar, mekanik sıkışma ve besleme değerlerini sırayla kontrol edin.'; if(pc===1){ hint='Step motor için akım ayarı, güç kaynağı voltajı, mikrostep ve yüksek devir tork düşümü kontrol edilmeli.'; } if(pc===2){ hint='Servo alarm kodu, fren, enkoder kablosu, atalet oranı ve sürücü parametreleri kontrol edilmeli.'; } if(pc===3){ hint='Kaplin, kremayer boşluğu, steps/mm, pulse sınırı ve mekanik kayma kontrol edilmeli.'; } if(pc===4 || pc===5){ hint='İnverter parametresi, enable sinyali, frekans komutu, motor etiketi ve hata kodu kontrol edilmeli.'; } if(pc===6 || pc===7){ hint='Yağlama, boşluk, yataklama, hizalama ve diş/vida aşınması kontrol edilmeli.'; } r = [add('Ön teşhis risk puanı', risk, 'puan', hint), add('Sıcaklık kontrol değeri', temp, '°C', temp>70?'Yüksek sıcaklık arıza belirtisi olabilir':''), add('Mikrostep/pulse dikkat seviyesi', msA, 'çarpan', msA>16?'Pulse ihtiyacı artabilir':'')]; break; } case 'urun-uyum-kontrol-sistemi': { var mt0 = num(form,'motor_torque_nm'), dc = num(form,'driver_current_a'), pv = num(form,'psu_voltage'), rg0 = num(form,'ratio')||1, pd0 = num(form,'pinyon_diameter_mm'), ma0 = num(form,'mass_kg'), tv0 = num(form,'target_speed'), ac0 = num(form,'acceleration'); var forceHave = mt0*rg0/(Math.max(pd0/2000,0.0001)); var forceNeed = ma0*ac0; var scoreU = forceNeed>0 ? forceHave/forceNeed : 0; var speedNote = tv0>18000 ? 'Yüksek hızda step tork düşümü kontrol edilmeli' : 'Hız hedefi daha makul aralıkta'; r = [add('Teorik itme kuvveti', forceHave, 'N', ''), add('İvme için gereken kuvvet', forceNeed, 'N', ''), add('Uyum güvenlik oranı', scoreU, 'kat', scoreU<2?'Sınırda; bir üst sınıf düşünülmeli':'Ön seçim olumlu'), add('Besleme voltajı kontrolü', pv, 'V', pv<48?'Yüksek hız için düşük kalabilir':speedNote)]; break; } case 'cnc-elektrik-tuketimi-gelismis': { var kwT = num(form,'spindle_kw')+num(form,'drive_kw')+num(form,'vacuum_kw')+num(form,'dust_kw')+num(form,'compressor_kw'); var dh0 = num(form,'daily_hours'), wd = num(form,'work_days'), ep = num(form,'electric_price'), sm0 = num(form,'simultaneous_percent')/100; var avgKw = kwT*sm0; var daily = avgKw*dh0*ep; r = [add('Ortalama çalışma gücü', avgKw, 'kW', ''), add('Saatlik elektrik maliyeti', avgKw*ep, 'TL/saat', ''), add('Günlük elektrik maliyeti', daily, 'TL/gün', ''), add('Aylık elektrik maliyeti', daily*wd, 'TL/ay', '')]; break; } case 'cnc-yatirim-geri-donus-hesaplayici': { var inv = num(form,'investment'), dp = num(form,'daily_pieces'), pp = num(form,'profit_per_piece'), wdays = num(form,'work_days'), fixed = num(form,'fixed_monthly'), riskp = num(form,'risk_percent')/100; var gross = dp*pp*wdays; var net = gross*(1-riskp)-fixed; var months = net>0 ? inv/net : 0; r = [add('Aylık brüt katkı', gross, 'TL', ''), add('Risk ve gider sonrası net kazanç', net, 'TL/ay', net<=0?'Yatırım geri dönüşü oluşmuyor':''), add('Yaklaşık geri dönüş süresi', months, 'ay', '')]; break; } case 'dxf-kesim-suresi-teklif-hesaplama': { var cl = num(form,'cut_length_mm'), pc0 = num(form,'pierce_count'), ff0 = num(form,'feed_mm_min')||1, spp = num(form,'sec_per_pierce'), setup0 = num(form,'setup_min'), mat0 = num(form,'material_cost'), mhc = num(form,'machine_hour_cost'), profit0 = num(form,'profit_percent')/100; var cutTime = cl/ff0; var totalTime = cutTime + pc0*spp/60 + setup0; var cost0 = mat0 + totalTime/60*mhc; var quote = cost0*(1+profit0); r = [add('Yaklaşık kesim süresi', cutTime, 'dk', ''), add('Toplam iş süresi', totalTime, 'dk', ''), add('Yaklaşık maliyet', cost0, 'TL', ''), add('Önerilen teklif bedeli', quote, 'TL', 'Kâr dahil ön teklif')]; break; } case 'cnc-saha-kesim-parametre-sihirbazi': { var matK = num(form,'material_type') || 1; var dK = num(form,'tool_diameter_mm') || 1; var flK = num(form,'flute_count') || 1; var depK = num(form,'depth_mm'); var widthK = dK * (num(form,'width_percent')/100); var priK = num(form,'priority_factor') || 1; var machK = num(form,'machine_quality') || 1; var spindleK = num(form,'spindle_kw') || 1; var baseVcK = 350 * matK; var rpmK = (baseVcK * 1000) / (PI * dK); rpmK = Math.min(Math.max(rpmK, 6000), 24000); var chipK = Math.max(0.015, Math.min(0.12, dK * 0.008 * matK * priK)); var feedK = rpmK * flK * chipK * machK; var mrrK = depK * widthK * feedK / 1000; var kwNeedK = mrrK * 0.016 / Math.max(0.55, matK) * (1 + Math.max(0, depK/dK-0.8)*0.35); var loadPctK = spindleK > 0 ? kwNeedK/spindleK*100 : 0; r = [add('Önerilen başlangıç devri', rpmK, 'rpm', 'Malzeme ve takım çapına göre'), add('Önerilen başlangıç F', feedK, 'mm/dk', 'Makine kalitesi ve öncelik hesaba katıldı'), add('Tahmini talaş yükü', chipK, 'mm/diş', ''), add('Talaş kaldırma hacmi', mrrK, 'cm³/dk', ''), add('Spindle yük tahmini', loadPctK, '%', loadPctK>85?'Spindle sınırda; paso veya F düşürülmeli':'Ön seçim daha güvenli')]; break; } case 'cnc-makine-kalitesine-gore-kesim-suresi': { var pathQ = num(form,'cut_length_mm'); var baseFeedQ = num(form,'machine_feed_base') || 1; var matQ = num(form,'material_factor') || 1; var pierQ = num(form,'pierce_count'); var secPierQ = num(form,'sec_per_pierce'); var tcQ = num(form,'tool_change_count'); var tcMinQ = num(form,'min_per_tool_change'); var setupQ = num(form,'setup_min'); var effQ = Math.max(10, num(form,'efficiency_percent'))/100; var practicalFeedQ = baseFeedQ * matQ * effQ; var cutMinQ = practicalFeedQ>0 ? pathQ/practicalFeedQ : 0; var totalQ = cutMinQ + pierQ*secPierQ/60 + tcQ*tcMinQ + setupQ; var pcs8h = totalQ>0 ? (8*60)/totalQ : 0; r = [add('Makineye göre pratik F', practicalFeedQ, 'mm/dk', ''), add('Net kesim süresi', cutMinQ, 'dk', ''), add('Toplam gerçekçi iş süresi', totalQ, 'dk', 'Hazırlık, dalma ve takım değişimi dahil'), add('8 saatte yaklaşık kapasite', pcs8h, 'adet', '')]; break; } case 'spindle-secimi-saha-hesaplama': { var mp = num(form,'material_power') || 0.016; var feedSp = num(form,'target_feed_mm_min'); var toolSp = num(form,'max_tool_diameter_mm') || 1; var depSp = num(form,'single_pass_depth_mm'); var widthSp = toolSp * (num(form,'cut_width_percent')/100); var mqSp = num(form,'machine_quality') || 1; var dutySp = num(form,'duty_factor') || 1; var mrrSp = depSp * widthSp * feedSp / 1000; var kwRawSp = mrrSp * mp * dutySp / mqSp; var classes = [2.2,3.5,4.5,6,7.5,9,12]; var rec = classes[classes.length-1]; for(var ci=0; ci= kwRawSp*1.15){ rec = classes[ci]; break; } } var f45 = kwRawSp>0 ? feedSp * Math.sqrt(4.5/kwRawSp) : feedSp; var f75 = kwRawSp>0 ? feedSp * Math.sqrt(7.5/kwRawSp) : feedSp; r = [add('Talaş kaldırma hacmi', mrrSp, 'cm³/dk', ''), add('Yaklaşık gerekli spindle gücü', kwRawSp, 'kW', ''), add('Önerilen spindle sınıfı', rec, 'kW', rec>=7.5?'Ağır üretim veya büyük takım için':'Ön seçim'), add('4.5 kW ile tahmini güvenli F', f45, 'mm/dk', ''), add('7.5 kW ile tahmini güvenli F', f75, 'mm/dk', '')]; break; } case 'pano-fani-sogutma-hesaplama': { var loss = num(form,'loss_w'), dtp = num(form,'temp_rise_c')||1, safp = num(form,'safety_percent')/100; var m3h = (3.1 * loss / dtp) * (1+safp); r = [add('Gerekli yaklaşık hava debisi', m3h, 'm³/saat', 'Filtre ve yaz sıcaklığı için pay eklenmiştir'), add('Dakikadaki hava debisi', m3h/60, 'm³/dk', ''), add('Isı yükü', loss, 'W', '')]; break; } case 'gcode-feedrate-cevirici': { var f = num(form,'feed_mm_min'); r = [add('G-code F değeri', f, 'mm/dk', ''), add('İlerleme', f/60, 'mm/sn', ''), add('İlerleme', f/1000, 'm/dk', ''), add('1 metrelik yolu alma süresi', f>0 ? 1000/f : 0, 'dk', '')]; break; } case 'gcode-kod-rehberi': { var cid = num(form,'code_id'); var risk = cid===2 ? 80 : (cid===6 ? 70 : (cid===4 || cid===7 ? 45 : 25)); var hint = 'Seçilen kod temel kontrol kodudur; çalıştırmadan önce sıfır noktası ve güvenli Z kontrol edilir.'; if(cid===1){ hint='G90 mutlak koordinattır; hareketler iş sıfırına göre yorumlanır.'; } if(cid===2){ hint='G91 artımsal koordinattır; açık kalırsa beklenmeyen hareket oluşturabilir.'; } if(cid===3){ hint='G21 milimetre birimidir; G20 inç moduna karşı kontrol edilmelidir.'; } if(cid===4){ hint='M3 spindle çalıştırır; devir komutu ve inverter enable kontrol edilmelidir.'; } if(cid===5){ hint='M5 spindle durdurur; duruş süresi ve frenleme davranışı kontrol edilmelidir.'; } if(cid===6){ hint='M6 takım değiştirir; makro, güvenli Z, hava ve takım boyu kontrolü gerekir.'; } if(cid===7){ hint='M8 soğutma açar; çıkış rölesi ve pompa yönü kontrol edilmelidir.'; } if(cid===8){ hint='M9 soğutma kapatır; iş sonunda açık kalmaması gerekir.'; } r = [add('Kod risk dikkat puanı', risk, 'puan', hint), add('Kontrol seviyesi', cid, 'kod', '')]; break; } case 'takim-boyu-sifirlama-yardimcisi': { var th = num(form,'probe_thickness_mm'), tz = num(form,'touch_z_mm'), sz = num(form,'safe_z_mm'); var offset = tz - th; r = [add('Hesaplanan Z ofset yorumu', offset, 'mm', 'Kontrol sistemindeki makro mantığına göre doğrulanmalıdır'), add('Güvenli kalkış yüksekliği', sz, 'mm', sz < 10 ? 'Düşük olabilir' : 'Genel başlangıç için uygun'), add('Prob kalınlığı', th, 'mm', '')]; break; } case 'probe-makro-on-kontrol': { var pf = num(form,'probe_feed')||1, sd = num(form,'search_distance'), pt = num(form,'plate_thickness'), szp = num(form,'safe_z'); var sec = sd / pf * 60; r = [add('Maksimum probe arama süresi', sec, 'sn', ''), add('Prob plaka kalınlığı', pt, 'mm', ''), add('Güvenli Z', szp, 'mm', szp < pt ? 'Prob plakasından düşük olabilir; kontrol edin' : '')]; break; } case 'delik-cevrimi-gcode-yardimcisi': { var hc = num(form,'hole_count'), dep0 = num(form,'depth_mm'), safe0 = num(form,'safe_z_mm'), feed0 = num(form,'feed_mm_min')||1, rap0 = num(form,'rapid_mm_min')||1; var per = dep0/feed0 + (dep0+safe0)/rap0; var total = per*hc; r = [add('Delik başı yaklaşık süre', per*60, 'sn', ''), add('Toplam delik süresi', total, 'dk', ''), add('Delik adedi', hc, 'adet', '')]; break; } case 'dikdortgen-kesim-yolu-hesaplama': { var w = num(form,'width_mm'), h0 = num(form,'height_mm'), pc = num(form,'piece_count'), pass = num(form,'pass_count')||1, feed = num(form,'feed_mm_min')||1; var path = 2*(w+h0)*pc*pass; r = [add('Toplam kesim yolu', path, 'mm', ''), add('Toplam kesim yolu', path/1000, 'm', ''), add('Yaklaşık kesim süresi', path/feed, 'dk', '')]; break; } case 'dairesel-cep-kesim-yolu-hesaplama': { var dia = num(form,'pocket_diameter_mm'), tool = num(form,'tool_diameter_mm')||1, stepPct = num(form,'stepover_percent')/100, passc = num(form,'pass_count')||1, feedp = num(form,'feed_mm_min')||1; var stepover = Math.max(tool*stepPct,0.001); var loops = Math.ceil((dia/2)/stepover); var avgDia = dia/2; var path = loops * PI * avgDia * passc; r = [add('Yaklaşık halka sayısı', loops, 'tur', ''), add('Yaklaşık takım yolu', path, 'mm', ''), add('Yaklaşık süre', path/feedp, 'dk', '')]; break; } case 'dxf-kapali-kontur-kontrol-listesi': { var open = num(form,'open_contours'), dup = num(form,'duplicate_lines'), tiny = num(form,'tiny_segments'), lay = num(form,'layer_count'); var riskD = open*30 + dup*20 + tiny*2 + Math.max(0,lay-3)*5; r = [add('CAM hazırlık risk puanı', riskD, 'puan', riskD>50?'DXF temizlenmeden kesime girilmemeli':'Ön kontrol daha olumlu'), add('Açık kontur', open, 'adet', ''), add('Üst üste çizgi', dup, 'adet', '')]; break; } case 'dxf-fire-malzeme-hesaplama': { var sw = num(form,'sheet_w'), sh = num(form,'sheet_h'), pa = num(form,'part_area_cm2'), pcs = num(form,'piece_count'), waste = num(form,'waste_percent')/100, scost = num(form,'sheet_cost'); var sheetArea = sw*sh/100; var needArea = pa*pcs*(1+waste); var use = sheetArea>0 ? needArea/sheetArea : 0; r = [add('Plaka kullanım oranı', use*100, '%', use>1?'Bir plakadan fazla gerekebilir':''), add('Fire paylı gerekli alan', needArea, 'cm²', ''), add('Yaklaşık malzeme maliyeti', scost*use, 'TL', '')]; break; } case 'cnc-teklif-hazirlama-sihirbazi': { var mat = num(form,'material_cost'), pm = num(form,'process_min'), mh = num(form,'machine_hour'), lab = num(form,'labor_cost'), tc = num(form,'tool_cost'), wp = num(form,'waste_percent')/100, prof = num(form,'profit_percent')/100; var base = mat + pm/60*mh + lab + tc; var risked = base*(1+wp); var quote = risked*(1+prof); r = [add('Net maliyet', base, 'TL', ''), add('Risk/fire dahil maliyet', risked, 'TL', ''), add('Önerilen teklif bedeli', quote, 'TL', 'Kâr dahil'), add('Minimum zarar etmeme fiyatı', risked, 'TL', '')]; break; } case 'operator-verimlilik-hesaplama': { var shift = num(form,'shift_hours')*60, setup = num(form,'setup_min'), cut = num(form,'cut_min'), hand = num(form,'handling_min'), down = num(form,'downtime_percent')/100; var usable = Math.max(0,(shift-setup)*(1-down)); var cycle = cut+hand; var pieces = cycle>0 ? usable/cycle : 0; r = [add('Kullanılabilir üretim süresi', usable, 'dk', ''), add('Parça çevrim süresi', cycle, 'dk/parça', ''), add('Günlük üretim kapasitesi', pieces, 'adet', '')]; break; } case 'bakim-sarf-malzeme-maliyet-hesaplama': { var oil = num(form,'oil_cost'), filt = num(form,'filter_cost'), toolc = num(form,'tool_cost'), serv = num(form,'service_cost'), dh = num(form,'downtime_hours'), mhv = num(form,'machine_hour_value'); var total = oil+filt+toolc+serv+dh*mhv; r = [add('Aylık bakım ve sarf yükü', total, 'TL/ay', ''), add('Duruş fırsat maliyeti', dh*mhv, 'TL', ''), add('Günlük ortalama bakım payı', total/26, 'TL/gün', '')]; break; } case 'cnc-yuzey-puruzlulugu-tahmini': { var td0 = num(form,'tool_diameter_mm')||1, so = num(form,'stepover_mm'), tt0 = num(form,'tool_type')||1; var R = td0/2; var scallop = (so*so)/(8*R)*tt0; r = [add('Teorik iz yüksekliği', scallop, 'mm', scallop>0.03?'Yüzey izi belirgin olabilir':'Daha ince yüzey beklenir'), add('Teorik iz yüksekliği', scallop*1000, 'mikron', ''), add('Step-over / çap oranı', so/td0*100, '%', '')]; break; } case 'lineer-ray-yaglama-miktari-hesaplama': { var cc = num(form,'carriage_count'), dhy = num(form,'daily_hours'), df = num(form,'dust_factor'), al = num(form,'auto_lube'); var score = cc*dhy*df*al/8; var days = Math.max(1, Math.round(14/Math.max(1,score/4))); r = [add('Yağlama yoğunluk skoru', score, 'puan', score>20?'Ağır/tozlu kullanım':'Normal kullanım'), add('Önerilen kontrol aralığı', days, 'gün', ''), add('Toplam araba sayısı', cc, 'adet', '')]; break; } case 'cnc-yerlesim-alan-hesaplama': { var mw = num(form,'machine_w'), ml = num(form,'machine_l'), ss = num(form,'service_space'), ls = num(form,'loading_space'); var totalW = mw + 2*ss; var totalL = ml + 2*ss + ls; r = [add('Gerekli minimum genişlik', totalW, 'mm', ''), add('Gerekli minimum uzunluk', totalL, 'mm', ''), add('Yaklaşık yerleşim alanı', totalW*totalL/1000000, 'm²', '')]; break; } case 'makine-nakliye-kapi-gecis-kontrolu': { var mw0 = num(form,'machine_w'), mh0 = num(form,'machine_h'), dw = num(form,'door_w'), dh0 = num(form,'door_h'), mar = num(form,'margin_mm'); var wclear = dw - mar - mw0; var hclear = dh0 - mar - mh0; r = [add('Genişlik boşluğu', wclear, 'mm', wclear<0?'Geçiş riski yüksek':''), add('Yükseklik boşluğu', hclear, 'mm', hclear<0?'Geçiş riski yüksek':''), add('Geçiş uygunluk puanı', Math.min(wclear,hclear), 'mm', Math.min(wclear,hclear)<0?'Yer keşfi şart':'Ön kontrol olumlu')]; break; } case 'kompresor-tank-dolum-suresi-hesaplama': { var tank = num(form,'tank_l'), ps = num(form,'p_start'), pe = num(form,'p_end'), fad = num(form,'fadm')||1; var air = tank*Math.max(0,pe-ps); r = [add('Gerekli serbest hava', air, 'L', ''), add('Yaklaşık dolum süresi', air/fad, 'dk', ''), add('Yaklaşık dolum süresi', air/fad*60, 'sn', '')]; break; } case 'inverter-fren-direnci-on-secim': { var mk = num(form,'motor_kw'), bp = num(form,'brake_percent')/100, stime = num(form,'stop_time_s')||1, cyc = num(form,'cycle_per_hour'); var peak = mk*1000*bp; var avg = peak*stime*cyc/3600; r = [add('Yaklaşık anlık fren gücü', peak, 'W', ''), add('Saatlik ortalama fren gücü', avg, 'W', avg>200?'Direnç watt değeri dikkatli seçilmeli':''), add('Duruş süresi', stime, 'sn', '')]; break; } case 'cnc-kesici-takim-maliyet-hesaplama': { var tp = num(form,'tool_price'), life = num(form,'tool_life_min')||1, part = num(form,'part_cut_min'), br = num(form,'breakage_percent')/100; var cpm = tp/life; var ppc = cpm*part*(1+br); r = [add('Takım dakika maliyeti', cpm, 'TL/dk', ''), add('Parça başı takım maliyeti', ppc, 'TL/parça', ''), add('Bir takımla tahmini parça', life/Math.max(part,0.001), 'adet', '')]; break; } case 'genel-dc-guc-kaynagi-kapasite-hesaplama': { var vdc = num(form,'voltage'), lc = num(form,'load_current'), sim = num(form,'simultaneous_percent')/100, st = num(form,'start_margin_percent')/100, sf = num(form,'safety_percent')/100; var runA = lc * sim; var reqA = runA * (1 + st) * (1 + sf); r = [add('Eş zamanlı çalışma akımı', runA, 'A', ''), add('Önerilen güç kaynağı akımı', reqA, 'A', 'Bir üst standart amper değeri seçilir'), add('Önerilen güç kaynağı gücü', reqA*vdc, 'W', ''), add('Önerilen güç kaynağı gücü', reqA*vdc/1000, 'kW', '')]; break; } case 'pano-24v-yardimci-guc-hesaplama': { var plc = num(form,'plc_current'), sc = num(form,'sensor_count'), sma = num(form,'sensor_current_ma'), vc = num(form,'valve_count'), vma = num(form,'valve_current_ma'), aux = num(form,'aux_current'), mar = num(form,'margin_percent')/100; var amps = plc + sc*sma/1000 + vc*vma/1000 + aux; var rec = amps*(1+mar); r = [add('Toplam 24V nominal akım', amps, 'A', ''), add('Önerilen 24V güç kaynağı akımı', rec, 'A', ''), add('Önerilen 24V güç kaynağı gücü', rec*24, 'W', ''), add('Valf ve sensörlerin toplam payı', sc*sma/1000 + vc*vma/1000, 'A', '')]; break; } case 'aku-ups-yedekleme-suresi-hesaplama': { var ah = num(form,'battery_ah'), bv = num(form,'battery_voltage'), lw = num(form,'load_watt')||1, effu = num(form,'efficiency')/100, usable = num(form,'usable_percent')/100; var wh = ah*bv; var useWh = wh*effu*usable; r = [add('Teorik akü enerjisi', wh, 'Wh', ''), add('Kullanılabilir enerji', useWh, 'Wh', 'Verim ve güvenli deşarj sonrası'), add('Yaklaşık yedekleme süresi', useWh/lw, 'saat', ''), add('Yaklaşık yedekleme süresi', useWh/lw*60, 'dk', '')]; break; } case 'blower-fan-motor-guc-akim-hesaplama': { var ph = text(form,'phase_type'), mk = num(form,'motor_kw'), volt0 = num(form,'voltage')||1, pf0 = num(form,'power_factor')||1, ef0 = num(form,'efficiency')/100, srv = num(form,'service_factor')||1; var denom = (String(ph).indexOf('Üç') !== -1 || form.elements['phase_type'].value === 'three') ? SQRT3*volt0*pf0*ef0 : volt0*pf0*ef0; var amp = denom>0 ? mk*1000/denom : 0; r = [add('Tahmini çalışma akımı', amp, 'A', ''), add('Servis paylı akım', amp*srv, 'A', 'Kablo/sigorta ön kontrolü'), add('Yaklaşık giriş gücü', mk/Math.max(ef0,0.001), 'kW', ''), add('Motor gücü', mk, 'kW', '')]; break; } case 'blower-fan-debi-basinc-guc-hesaplama': { var q = num(form,'airflow_m3h')/3600, dp = num(form,'pressure_pa'), effb = num(form,'efficiency')/100, mb = num(form,'margin_percent')/100; var airW = q*dp; var motorW = effb>0 ? airW/effb*(1+mb) : 0; r = [add('Hava gücü', airW, 'W', 'Debi x basınç'), add('Önerilen motor gücü', motorW, 'W', 'Verim ve emniyet paylı'), add('Önerilen motor gücü', motorW/1000, 'kW', ''), add('Debi', q*3600, 'm³/h', '')]; break; } case 'pompa-motor-guc-hesaplama': { var flow = num(form,'flow_m3h')/3600, head = num(form,'head_m'), den = num(form,'density'), effp = num(form,'efficiency')/100, mp = num(form,'margin_percent')/100; var hydW = den*9.80665*flow*head; var motW = effp>0 ? hydW/effp*(1+mp) : 0; r = [add('Hidrolik güç', hydW, 'W', ''), add('Önerilen motor gücü', motW, 'W', ''), add('Önerilen motor gücü', motW/1000, 'kW', ''), add('Debi', flow*3600, 'm³/h', '')]; break; } case 'konveyor-motor-guc-hiz-hesaplama': { var load = num(form,'load_kg'), bs = num(form,'belt_speed_m_min'), drum = num(form,'drum_diameter_mm')/1000, mu = num(form,'friction_coeff'), deg = num(form,'incline_deg')*PI/180, effc = num(form,'efficiency')/100, mc = num(form,'margin_percent')/100; var force = load*9.80665*(mu*Math.cos(deg)+Math.sin(deg)); var speedMs = bs/60; var torque = force*(drum/2)/Math.max(effc,0.001)*(1+mc); var kwc = force*speedMs/Math.max(effc,0.001)*(1+mc)/1000; var rpmc = drum>0 ? bs/(PI*drum) : 0; r = [add('Gerekli tambur devri', rpmc, 'rpm', ''), add('Bant çekiş kuvveti', force, 'N', ''), add('Tambur çıkış torku', torque, 'Nm', ''), add('Yaklaşık motor gücü', kwc, 'kW', '')]; break; } case 'rezistans-isitici-guc-hesaplama': { var m = num(form,'mass_kg'), cp = num(form,'specific_heat'), dt = num(form,'temp_delta'), tm = num(form,'time_min')||1, loss = num(form,'loss_percent')/100; var kj = m*cp*dt; var kwr = (kj/(tm*60))*(1+loss); r = [add('Gerekli ısı enerjisi', kj, 'kJ', ''), add('Önerilen ısıtıcı gücü', kwr, 'kW', ''), add('Önerilen ısıtıcı gücü', kwr*1000, 'W', ''), add('Saatlik enerji tüketimi', kwr, 'kWh/saat', '')]; break; } case 'solenoid-valf-guc-kaynagi-hesaplama': { var vc0 = num(form,'valve_count'), cw = num(form,'coil_watt'), vv = num(form,'voltage')||24, sm = num(form,'simultaneous_percent')/100, mm = num(form,'margin_percent')/100; var watts = vc0*cw*sm*(1+mm); r = [add('Eş zamanlı bobin gücü', vc0*cw*sm, 'W', ''), add('Önerilen güç kaynağı gücü', watts, 'W', ''), add('Önerilen güç kaynağı akımı', watts/vv, 'A', ''), add('Toplam bobin sayısı', vc0, 'adet', '')]; break; } case 'sensor-plc-io-guc-butcesi': { var ccu = num(form,'controller_current'), ic = num(form,'input_count'), ima = num(form,'input_ma'), oc = num(form,'output_count'), oma = num(form,'output_ma'), hmi = num(form,'hmi_current'), marg = num(form,'margin_percent')/100; var totalA = ccu + ic*ima/1000 + oc*oma/1000 + hmi; r = [add('Toplam 24V I/O akımı', totalA, 'A', ''), add('Emniyet paylı akım', totalA*(1+marg), 'A', ''), add('Emniyet paylı güç', totalA*(1+marg)*24, 'W', ''), add('Çıkış yükleri payı', oc*oma/1000, 'A', '')]; break; } case 'trifaze-motor-akim-kablo-sigorta-hesaplama': { var kwm = num(form,'motor_kw'), vl = num(form,'voltage')||380, pfm = num(form,'power_factor')||1, efm = num(form,'efficiency')/100, len = num(form,'cable_length_m'), sfac = num(form,'start_factor')||1; var amp3 = kwm*1000/(SQRT3*vl*pfm*Math.max(efm,0.001)); var starter = amp3*sfac; var approxCable = amp3 <= 10 ? 1.5 : amp3 <= 16 ? 2.5 : amp3 <= 25 ? 4 : amp3 <= 32 ? 6 : amp3 <= 50 ? 10 : amp3 <= 63 ? 16 : 25; r = [add('Tahmini çalışma akımı', amp3, 'A', ''), add('Yaklaşık kalkış akımı', starter, 'A', ''), add('Ön kablo kesiti sınıfı', approxCable, 'mm²', len>30?'Uzun kabloda gerilim düşümü ayrıca kontrol edilmeli':''), add('Yaklaşık sigorta alt sınırı', amp3*1.25, 'A', '')]; break; } case 'jenerator-kva-hesaplama': { var tk = num(form,'total_kw'), pfj = num(form,'power_factor')||0.8, sj = num(form,'simultaneous_percent')/100, skw = num(form,'start_extra_kw'), mj = num(form,'margin_percent')/100; var workKw = tk*sj + skw; var kva = workKw/pfj*(1+mj); r = [add('Eş zamanlı + kalkış yükü', workKw, 'kW', ''), add('Önerilen jeneratör kapasitesi', kva, 'kVA', ''), add('Yaklaşık aktif güç karşılığı', kva*pfj, 'kW', ''), add('Emniyet payı', mj*100, '%', '')]; break; } case 'motor-kalkis-akimi-hesaplama': { var run = num(form,'running_current'), stype = num(form,'start_type')||1, ss = num(form,'start_seconds'), sph = num(form,'starts_per_hour'); var ia = run*stype; r = [add('Yaklaşık kalkış akımı', ia, 'A', ''), add('Çalışma akımına göre katsayı', stype, 'x', ''), add('Saatlik yüksek akım süresi', ss*sph, 'sn/saat', ''), add('Termik yük göstergesi', ia*ss*sph/3600, 'A·s/saat', '')]; break; } case 'endustriyel-guc-dagitim-senaryo-hesabi': { var ac = num(form,'motor_kw'), dc = num(form,'dc_watt')/1000, heat = num(form,'heater_kw'), auxw = num(form,'aux_watt')/1000, simg = num(form,'simultaneous_percent')/100, pfg = num(form,'power_factor')||0.85, mg = num(form,'margin_percent')/100; var total = ac + dc + heat + auxw; var active = total*simg*(1+mg); r = [add('Kurulu güç toplamı', total, 'kW', ''), add('Eş zamanlı emniyetli aktif güç', active, 'kW', ''), add('Yaklaşık kVA ihtiyacı', active/pfg, 'kVA', ''), add('Yardımcı yüklerin toplam payı', dc+auxw, 'kW', '')]; break; } case 'basincli-hava-kacak-maliyeti-hesaplama': { var leak = num(form,'leak_l_min')/1000, spec = num(form,'specific_kw_m3_min'), hd = num(form,'hours_day'), dy = num(form,'days_year'), ep = num(form,'electric_price'); var kwLoss = leak*spec; var kwhYear = kwLoss*hd*dy; r = [add('Kaçak kaynaklı güç kaybı', kwLoss, 'kW', ''), add('Yıllık enerji kaybı', kwhYear, 'kWh/yıl', ''), add('Yıllık yaklaşık maliyet', kwhYear*ep, 'TL/yıl', ''), add('Aylık yaklaşık maliyet', kwhYear*ep/12, 'TL/ay', '')]; break; } case 'hidrolik-silindir-kuvvet-hesaplama': { var pd = num(form,'piston_diameter_mm')/1000, rd = num(form,'rod_diameter_mm')/1000, bar = num(form,'pressure_bar'), eh = num(form,'efficiency')/100; var pa = bar*100000; var areaPush = PI*pd*pd/4; var areaPull = Math.max(areaPush - PI*rd*rd/4, 0); var pushN = pa*areaPush*eh; var pullN = pa*areaPull*eh; r = [add('İtme kuvveti', pushN, 'N', ''), add('İtme kuvveti', pushN/1000/9.80665, 'ton', ''), add('Çekme kuvveti', pullN, 'N', 'Mil alanı düşülmüş'), add('Çekme kuvveti', pullN/1000/9.80665, 'ton', '')]; break; } case 'pano-isi-yuku-sogutma-hesaplama': { var dkw = num(form,'drive_kw'), lp = num(form,'loss_percent')/100, auxh = num(form,'aux_watt'), dtc = num(form,'allowed_delta')||10, mh = num(form,'margin_percent')/100; var heatW = (dkw*1000*lp + auxh)*(1+mh); var airflow = heatW/(1.2*Math.max(dtc,1))*3.6; r = [add('Pano içi yaklaşık ısı yükü', heatW, 'W', ''), add('Yaklaşık minimum hava debisi', airflow, 'm³/h', 'Filtre ve kayıplar hariç'), add('Isı yükü', heatW/1000, 'kW', ''), add('İzin verilen sıcaklık artışı', dtc, '°C', '')]; break; } case 'dc-gerilim-dusumu-hesaplama': { var vd = num(form,'voltage')||24, curd = num(form,'current'), lenm = num(form,'length_m'), sec = num(form,'section_mm2')||1; var rho = 0.0175; var drop = 2*lenm*rho*curd/sec; r = [add('Gerilim düşümü', drop, 'V', 'Gidiş-dönüş hat'), add('Gerilim düşümü oranı', drop/vd*100, '%', ''), add('Yük ucundaki yaklaşık voltaj', vd-drop, 'V', ''), add('Kablo direnci', 2*lenm*rho/sec, 'Ω', '')]; break; } case 'motor-koruma-salteri-secim-hesabi': { var ph = form.elements['phase_type'] ? form.elements['phase_type'].value : 'three', kw = num(form,'motor_kw'), v = num(form,'voltage')||1, pf = num(form,'power_factor')||1, eff = num(form,'efficiency')/100, sf = num(form,'start_factor')||1, mar = num(form,'service_margin')/100; var a = ph === 'three' ? kw*1000/(SQRT3*v*pf*Math.max(eff,0.001)) : kw*1000/(v*pf*Math.max(eff,0.001)); r = [add('Tahmini motor çalışma akımı', a, 'A', 'Etiket akımı varsa onu esas alın'), add('Şalter ayar hedefi', a*(1+mar), 'A', 'Motor koruma ayarı bu değere yakın sınıftan seçilir'), add('Yaklaşık kalkış akımı', a*sf, 'A', 'Yanlış atma riskini yorumlamak için'), add('Bir üst kontrol akımı', a*1.25, 'A', 'Kablo/sigorta ayrıca kontrol edilir')]; break; } case 'kontaktor-secim-hesabi': { var a = num(form,'load_current'), cls = num(form,'load_class')||1, sp = num(form,'safety_percent')/100, st = num(form,'starts_per_hour'), cv = form.elements['coil_voltage'] ? form.elements['coil_voltage'].value : '220'; var ie = a*cls*(1+sp); r = [add('Önerilen minimum kontaktör Ie', ie, 'A', 'Bir üst standart kontaktör seçilir'), add('Kullanım sınıfı katsayısı', cls, 'x', cls>1.3?'Ağır veya sık kalkışlı yük':'Normal ön kontrol'), add('Bobin voltajı', parseFloat(cv)||0, 'V', 'Pano kontrol voltajıyla aynı olmalı'), add('Saatlik anahtarlama', st, 'adet/saat', st>60?'Elektriksel ömür kontrol edilmeli':'')]; break; } case 'termik-role-ayari-hesabi': { var mc = num(form,'motor_current'), sfac = num(form,'service_factor')||1, amb = num(form,'ambient_c'), ss = num(form,'start_seconds'), adj = num(form,'safety_percent')/100; var set = mc*sfac*(1+adj); r = [add('Termik röle ayar hedefi', set, 'A', 'Genelde motor etiket akımına ayarlanır'), add('Alt kontrol sınırı', mc*0.95, 'A', ''), add('Üst kontrol sınırı', mc*1.05, 'A', ''), add('Saha risk notu', (amb>45?20:0)+(ss>8?20:0), 'puan', amb>45||ss>8?'Sıcaklık veya uzun kalkış nedeniyle atma davranışı kontrol edilmeli':'')]; break; } case 'pano-trafo-va-hesabi': { var steady = num(form,'steady_va'), cc = num(form,'contactor_count'), inrush = num(form,'coil_inrush_va'), hold = num(form,'coil_hold_va'), mar = num(form,'margin_percent')/100; var holdTotal = steady + cc*hold; var peak = steady + cc*inrush; r = [add('Sürekli VA ihtiyacı', holdTotal*(1+mar), 'VA', 'Tutma yükü ve yardımcı yükler'), add('Çekme anı tepe VA', peak*(1+mar), 'VA', 'Kontaktör ilk çekme anı'), add('Önerilen trafo sınıfı', Math.max(holdTotal, peak)*(1+mar), 'VA', 'Bir üst standart değer'), add('Bobin tutma toplamı', cc*hold, 'VA', '')]; break; } case 'reduktor-servis-faktoru-hesabi': { var h = num(form,'hours_day'), st = num(form,'starts_hour'), shock = num(form,'shock_class')||1, tq = num(form,'required_torque_nm'), mar = num(form,'margin_percent')/100; var hf = h>16?1.25:(h>8?1.12:1), sf = shock*(1+Math.min(st,120)/600)*hf*(1+mar); r = [add('Yaklaşık servis faktörü', sf, 'x', sf>1.5?'Ağır hizmet sınıfı':'Ön kontrol'), add('Gerekli katalog torku', tq*sf, 'Nm', 'Redüktör nominal torku bu değeri karşılamalı'), add('Çalışma süresi faktörü', hf, 'x', ''), add('Dur-kalk etkisi', 1+Math.min(st,120)/600, 'x', '')]; break; } case 'zincir-disli-oran-hesabi': { var d1 = num(form,'driver_teeth')||1, d2 = num(form,'driven_teeth')||1, rpm = num(form,'input_rpm'), tq = num(form,'input_torque_nm'), eff = num(form,'efficiency')/100; var ratio = d2/d1; r = [add('Aktarım oranı', ratio, 'x', ratio>1?'Hız düşer, tork artar':'Hız artar, tork düşer'), add('Çıkış devri', rpm/ratio, 'rpm', ''), add('Çıkış torku', tq*ratio*eff, 'Nm', ''), add('Verim kaybı', tq*ratio*(1-eff), 'Nm eşdeğer', '')]; break; } case 'toz-emis-hortum-capi-hava-hizi-hesabi': { var q = num(form,'airflow_m3h')/3600, d = num(form,'hose_diameter_mm')/1000, target = num(form,'target_speed_ms')||1, l = num(form,'hose_length_m'), eb = num(form,'elbow_count'); var area = PI*d*d/4, speed = area>0 ? q/area : 0, reqD = Math.sqrt(4*q/(PI*target))*1000; r = [add('Mevcut hortumda hava hızı', speed, 'm/sn', speed4||l>8?'Dirsek/uzunluk debiyi düşürebilir':''), add('Debi', q*3600, 'm³/h', '')]; break; } case 'fan-statik-basinc-debi-on-kontrol': { var q = num(form,'airflow_m3h')/3600, dl = num(form,'duct_loss_pa'), fl = num(form,'filter_loss_pa'), hl = num(form,'hood_loss_pa'), eff = num(form,'efficiency')/100, mar = num(form,'margin_percent')/100; var p = (dl+fl+hl)*(1+mar), w = q*p/Math.max(eff,0.001); r = [add('Toplam statik basınç hedefi', p, 'Pa', ''), add('Fan hava gücü', q*p, 'W', ''), add('Önerilen motor gücü', w, 'W', 'Verim ve pay dahil'), add('Önerilen motor gücü', w/1000, 'kW', '')]; break; } case 'pnomatik-silindir-hava-tuketimi-hesabi': { var bore = num(form,'bore_mm')/1000, stroke = num(form,'stroke_mm')/1000, bar = num(form,'pressure_bar'), cpm = num(form,'cycles_min'), factor = num(form,'action_factor')||2, mar = num(form,'margin_percent')/100; var volL = PI*bore*bore/4*stroke*1000; var freeLMin = volL*(bar+1)*factor*cpm*(1+mar); r = [add('Bir strok hacmi', volL, 'L', ''), add('Serbest hava tüketimi', freeLMin, 'L/dk', ''), add('Saatlik hava tüketimi', freeLMin*60, 'L/saat', ''), add('Kompresör paylı öneri', freeLMin*1.2, 'L/dk', 'Kompresör FAD değeriyle karşılaştırın')]; break; } case 'pompa-basma-yuksekligi-kayip-hesabi': { var stat = num(form,'static_head_m'), len = num(form,'pipe_length_m'), loss = num(form,'loss_per_m'), fit = num(form,'fitting_loss_m'), pbar = num(form,'required_pressure_bar'), mar = num(form,'margin_percent')/100; var total = (stat + len*loss + fit + pbar*10.197)*(1+mar); r = [add('Toplam basma yüksekliği', total, 'mSS', ''), add('Basınç karşılığı', total/10.197, 'bar', ''), add('Boru kaybı payı', len*loss+fit, 'mSS', ''), add('Statik yükseklik', stat, 'm', '')]; break; } case 'yuk-kaldirma-motor-gucu-hesabi': { var load = num(form,'load_kg'), speed = num(form,'speed_m_min')/60, dia = num(form,'drum_diameter_mm')/1000, eff = num(form,'efficiency')/100, mar = num(form,'margin_percent')/100; var force = load*9.80665, kw = force*speed/Math.max(eff,0.001)*(1+mar)/1000, tq = force*(dia/2)*(1+mar), rpm = dia>0 ? (speed*60)/(PI*dia) : 0; r = [add('Kaldırma kuvveti', force, 'N', ''), add('Tambur torku', tq, 'Nm', 'Fren torku ayrıca kontrol edilmeli'), add('Tambur devri', rpm, 'rpm', ''), add('Önerilen motor gücü', kw, 'kW', '')]; break; } case 'doner-tabla-tork-hesabi': { var m = num(form,'load_kg'), r0 = num(form,'radius_m'), rpm = num(form,'target_rpm'), t = num(form,'accel_time_s')||1, fr = num(form,'friction_torque_nm'), mar = num(form,'safety_percent')/100; var inertia = 0.5*m*r0*r0, alpha = (rpm*2*PI/60)/t, tq = (inertia*alpha+fr)*(1+mar); r = [add('Yaklaşık yük ataleti', inertia, 'kg·m²', ''), add('Açısal ivme', alpha, 'rad/sn²', ''), add('Gerekli tabla torku', tq, 'Nm', ''), add('Hedef açısal hız', rpm*2*PI/60, 'rad/sn', '')]; break; } case 'mikser-karistirici-motor-gucu-hesabi': { var rho = num(form,'density'), d = num(form,'impeller_diameter_mm')/1000, rpm = num(form,'rpm'), pfac = num(form,'process_factor')||1, mar = num(form,'margin_percent')/100; var n = rpm/60, p = pfac*rho*Math.pow(n,3)*Math.pow(d,5)*(1+mar); r = [add('Yaklaşık karıştırma gücü', p, 'W', 'Ön seçim'), add('Yaklaşık karıştırma gücü', p/1000, 'kW', ''), add('Devir etkisi göstergesi', Math.pow(n,3), 'n³', 'Devir artışı gücü çok artırır'), add('Çap etkisi göstergesi', Math.pow(d,5), 'D⁵', 'Çap artışı çok etkilidir')]; break; } case 'basincli-hava-boru-capi-on-secim': { var free = num(form,'free_air_l_min'), bar = num(form,'pressure_bar'), vel = num(form,'target_velocity_ms')||1, len = num(form,'line_length_m'), mar = num(form,'margin_percent')/100; var compM3s = (free/1000/60)/(bar+1)*(1+mar); var dia = Math.sqrt(4*compM3s/(PI*vel))*1000; r = [add('Önerilen yaklaşık iç çap', dia, 'mm', ''), add('Sıkıştırılmış hacimsel debi', compM3s*3600, 'm³/h', ''), add('Hat uzunluğu dikkat puanı', len/dia*10, 'puan', len>30?'Uzun hat; çap büyütme veya ring hat düşünülmeli':''), add('Serbest hava debisi', free, 'L/dk', '')]; break; } case 'kompresor-hat-basinc-dusumu-hesabi': { var free = num(form,'free_air_l_min'), d = num(form,'pipe_diameter_mm')||1, len = num(form,'line_length_m'), fittings = num(form,'fitting_count'), bar = num(form,'pressure_bar'); var speedScore = free/Math.max(1,d*d)*(bar+1); var drop = (len/10 + fittings*0.7)*speedScore/100; r = [add('Yaklaşık basınç düşümü skoru', drop, 'bar eşdeğer', drop>0.5?'Hat çapı veya bağlantılar kontrol edilmeli':'Ön risk düşük'), add('Hat direnç puanı', len+fittings*5, 'puan', ''), add('Boru çapı', d, 'mm', ''), add('Makine girişinde tahmini basınç', Math.max(0,bar-drop), 'bar', '')]; break; } case 'ssr-kontaktor-isi-yuku-hesabi': { var a = num(form,'load_current'), vd = num(form,'voltage_drop'), ph = num(form,'phase_count')||1, amb = num(form,'ambient_c'), rth = num(form,'heatsink_c_w')||1; var heat = a*vd*ph, rise = heat*rth; r = [add('SSR toplam ısı kaybı', heat, 'W', ''), add('Soğutucu sıcaklık artışı', rise, '°C', ''), add('Tahmini soğutucu sıcaklığı', amb+rise, '°C', amb+rise>80?'Soğutma yetersiz olabilir':''), add('Faz sayısı', ph, 'adet', '')]; break; } case 'motor-verim-enerji-tasarruf-hesabi': { var kw = num(form,'motor_kw'), load = num(form,'load_percent')/100, h = num(form,'hours_year'), olde = num(form,'old_efficiency')/100, newe = num(form,'new_efficiency')/100, price = num(form,'electric_price'); var mech = kw*load, oldKwh = mech/Math.max(olde,0.001)*h, newKwh = mech/Math.max(newe,0.001)*h, sav = oldKwh-newKwh; r = [add('Eski motor yıllık tüketim', oldKwh, 'kWh/yıl', ''), add('Yeni motor yıllık tüketim', newKwh, 'kWh/yıl', ''), add('Yıllık enerji tasarrufu', sav, 'kWh/yıl', ''), add('Yıllık maliyet tasarrufu', sav*price, 'TL/yıl', '')]; break; } case 'fan-filtre-kirlenme-debi-dusumu-hesabi': { var q = num(form,'nominal_airflow_m3h'), pc = num(form,'clean_pressure_pa')||1, pd = num(form,'dirty_pressure_pa')||1, exp = num(form,'fan_curve_factor')||0.5, minq = num(form,'min_required_airflow'); var remain = q*Math.pow(pc/pd, exp); r = [add('Kirli filtrede tahmini debi', remain, 'm³/h', remain4?'Aralık kısa tutulmalı':''), add('Önerilen kontrol aralığı', days, 'gün', ''), add('Aylık yaklaşık gres ihtiyacı', grams*30/days, 'g/ay', '')]; break; } case 'kayis-gerginlik-on-kontrol-hesabi': { var kw = num(form,'power_kw'), rpm = num(form,'rpm')||1, dia = num(form,'pulley_diameter_mm')/1000, belts = num(form,'belt_count')||1, sp = num(form,'service_percent')/100; var v = PI*dia*rpm/60, force = kw*1000/Math.max(v,0.001)*(1+sp), per = force/belts; r = [add('Kayış çevresel hızı', v, 'm/sn', ''), add('Toplam çevresel kuvvet', force, 'N', ''), add('Kayış başı kuvvet', per, 'N/kayış', ''), add('Servis payı', sp*100, '%', '')]; break; } case 'mil-kama-kesme-basinc-kontrolu': { var tq = num(form,'torque_nm'), d = num(form,'shaft_diameter_mm'), b = num(form,'key_width_mm'), h = num(form,'key_height_mm'), L = num(form,'key_length_mm'), allow = num(form,'allowable_mpa')||1; var F = tq*2000/Math.max(d,0.001), shear = F/(b*L), crush = F/((h/2)*L); r = [add('Kama çevresel kuvveti', F, 'N', ''), add('Kesme gerilmesi', shear, 'MPa', shear>allow?'Kesme riski yüksek':''), add('Ezilme basıncı', crush, 'MPa', crush>allow?'Ezilme riski yüksek':''), add('Emniyet oranı', allow/Math.max(shear,crush,0.001), 'kat', '')]; break; } case 'civata-sikma-torku-hesabi': { var d = num(form,'bolt_diameter_mm')/1000, F = num(form,'preload_kn')*1000, K = num(form,'nut_factor'), adj = num(form,'safety_percent')/100; var T = K*F*d*(1+adj); r = [add('Yaklaşık sıkma torku', T, 'Nm', 'Tork anahtarı ön değeri'), add('Hedef ön yük', F/1000, 'kN', ''), add('Sürtünme katsayısı', K, '', 'Yağlı/kuru bağlantıda değişir'), add('Cıvata çapı', d*1000, 'mm', '')]; break; } case 'ankraj-civata-yuk-kontrolu': { var load = num(form,'total_load_kn'), cnt = num(form,'bolt_count')||1, sf = num(form,'safety_factor')||1, allow = num(form,'allowable_per_bolt_kn')||1; var per = load*sf/cnt; r = [add('Emniyetli toplam yük', load*sf, 'kN', ''), add('Cıvata başı tasarım yükü', per, 'kN', per>allow?'İzin verilen değeri aşıyor':'Ön kontrol olumlu'), add('Cıvata başı izin verilen yük', allow, 'kN', ''), add('Yük kullanım oranı', per/allow*100, '%', '')]; break; } case 'motor-sicaklik-derating-hesabi': { var kw = num(form,'rated_kw'), amb = num(form,'ambient_c'), alt = num(form,'altitude_m'), duty = num(form,'duty_percent')/100, mar = num(form,'margin_percent')/100; var tempF = Math.max(0, amb-40)*0.01, altF = Math.max(0, alt-1000)/1000*0.03, usable = kw*Math.max(0.4,1-tempF-altF)*duty*(1-mar); r = [add('Tahmini güvenli kullanılabilir güç', usable, 'kW', usablemaxDepth?'Paso yüksek görünüyor':'Paso makul görünüyor')]; break; } case 'pleksi-erime-riski-hesabi': { var rpm=num(form,'rpm')||1, feed=num(form,'feed_mm_min')||1, d=num(form,'tool_diameter_mm')||1, fl=num(form,'flute_count')||1, dep=num(form,'depth_mm'), air=num(form,'air_assist')||1; var chip=feed/rpm/fl; var risk=(rpm/18000)*air*(dep/d)*Math.max(0.5,0.06/Math.max(chip,0.001))*100; r=[add('Talaş yükü', chip, 'mm/diş', ''), add('Erime risk puanı', risk, '/100', risk>100?'Yüksek risk: F artırın, rpm düşürün veya hava ekleyin':'Kontrollü başlangıç'), add('Paso/çap oranı', dep/d*100, '%', '')]; break; } case 'aluminyum-talas-tahliye-hesabi': { var rpm=num(form,'rpm')||1, feed=num(form,'feed_mm_min')||1, d=num(form,'tool_diameter_mm')||1, fl=num(form,'flute_count')||1, dep=num(form,'depth_mm'), cool=num(form,'cooling')||1; var chip=feed/rpm/fl; var mrr=dep*d*feed/1000; var risk=(fl*25)+(dep/d*60)+(cool*30)+(chip<0.025?30:0); r=[add('Talaş yükü', chip, 'mm/diş', ''), add('Talaş kaldırma hacmi', mrr, 'cm³/dk', ''), add('Talaş tahliye risk puanı', risk, '/100', risk>100?'Risk yüksek: ağız sayısı/paso/soğutma kontrol edilmeli':'Ön kontrol makul')]; break; } case 'compression-freze-uygunluk-kontrolu': { var th=num(form,'thickness_mm'), fp=num(form,'first_pass_mm'), up=num(form,'upcut_length_mm'), cl=num(form,'cutter_length_mm'), sp=num(form,'surface_priority')||1; var okFirst=fp>up?100:fp/up*100; var okLen=cl>=th?100:cl/th*100; var score=Math.min(okFirst,okLen)*sp; r=[add('İlk paso uygunluğu', okFirst, '%', fp<=up?'İlk paso upcut bölümünü aşmıyor':'İlk paso compression etkisine uygun'), add('Kesici boy uygunluğu', okLen, '%', cl5?'Yüksek titreşim riski':'Makul aralık'), add('Titreşim risk puanı', risk, '/100', risk>100?'Risk yüksek':'Ön kontrol'), add('Önerilen maksimum çıkma', d*4.5, 'mm', 'Mümkünse bu değere yaklaşın')]; break; } case 'tek-paso-derinlik-guvenli-mi-hesabi': { var d=num(form,'tool_diameter_mm')||1, desired=num(form,'desired_depth_mm'), mat=num(form,'material_factor')||1, mq=num(form,'machine_quality')||1, kw=num(form,'spindle_kw')||1; var safe=d*0.75*mat*mq*Math.min(1.35,Math.sqrt(kw/4.5)); r=[add('Tahmini güvenli başlangıç paso', safe, 'mm', ''), add('İstenen paso kullanım oranı', desired/safe*100, '%', desired>safe?'İstenen paso yüksek görünüyor':'Ön kontrol olumlu'), add('Takım çapına oran', desired/d*100, '%', '')]; break; } case 'takim-kirilma-risk-puani-hesabi': { var d=num(form,'tool_diameter_mm')||1, st=num(form,'stickout_mm'), dep=num(form,'depth_mm'), feed=num(form,'feed_mm_min'), rpm=num(form,'rpm')||1, fl=num(form,'flute_count')||1, mat=num(form,'material_factor')||1; var chip=feed/rpm/fl; var risk=(st/d*12)+(dep/d*35)+(chip/(d*0.01)*30)*mat; r=[add('Talaş yükü', chip, 'mm/diş', ''), add('Kırılma risk puanı', risk, '/100', risk>100?'Yüksek risk':'Ön kontrol'), add('Çıkma / çap oranı', st/d, '', '')]; break; } case 'makine-kalitesi-f-karsilastirma-hesabi': { var mat=num(form,'material_factor')||1, d=num(form,'tool_diameter_mm')||1, fl=num(form,'flute_count')||1, rpm=num(form,'rpm')||1, pr=num(form,'priority_factor')||1; var chip=d*0.008*mat*pr; var base=rpm*fl*chip; r=[add('Pro makine başlangıç F', base*1.2, 'mm/dk', ''), add('Orta makine başlangıç F', base, 'mm/dk', ''), add('Zayıf makine başlangıç F', base*0.55, 'mm/dk', ''), add('Tahmini talaş yükü', chip, 'mm/diş', '')]; break; } case 'kucuk-parca-vakum-tutus-riski-hesabi': { var L=num(form,'part_length_mm')/1000,W=num(form,'part_width_mm')/1000,kpa=num(form,'vacuum_kpa'), leak=num(form,'leak_percent')/100, cf=num(form,'cut_force_n'), sf=num(form,'safety_factor')||1; var hold=L*W*kpa*1000*(1-leak); var need=cf*sf; r=[add('Efektif tutma kuvveti', hold, 'N', ''), add('Gerekli güvenli tutma kuvveti', need, 'N', hold35?'Kullanılmayan bölgeleri kapatın':'Makul'), add('Kapalı alan oranı', cov/zone*100, '%', '')]; break; } case 'vakum-parca-kayma-riski-hesabi': { var hold=num(form,'hold_force_n'), mu=num(form,'friction_coeff'), cf=num(form,'cut_force_n'), sf=num(form,'safety_factor')||1; var side=hold*mu; var need=cf*sf; r=[add('Yan tutma kuvveti', side, 'N', ''), add('Gerekli güvenli yan kuvvet', need, 'N', sideduty?'Sürekli çalışma riski':'Makul'), add('Tank tampon oranı', tank/Math.max(total,1), 'dk', 'Yaklaşık tampon göstergesi')]; break; } case 'cnc-olcu-kacirma-teshis-araci': { var cmd=num(form,'command_mm')||1, meas=num(form,'measured_mm')||1, back=num(form,'backlash_mm'), steps=num(form,'steps_per_mm'), symptom=num(form,'symptom')||1; var err=meas-cmd; var newSteps=steps*cmd/meas; r=[add('Ölçü hatası', err, 'mm', ''), add('Hata oranı', err/cmd*100, '%', ''), add('Önerilen yeni steps/mm', newSteps, 'pulse/mm', 'Hata düzenli oransalsa kullanın'), add('Backlash pulse karşılığı', back*steps, 'pulse', symptom>1.15?'Belirti mekanik olabilir':'')]; break; } case 'backlash-bosluk-telafi-hesaplayici': { var b=num(form,'backlash_mm'), spm=num(form,'steps_per_mm'), ax=num(form,'axis_type')||1; var pulse=b*spm; r=[add('Telafi edilecek boşluk', b, 'mm', ''), add('Pulse karşılığı', pulse, 'pulse', ''), add('Mekanik risk puanı', b*100*ax, '/100', b>0.1?'Mekanik boşluk öncelikli giderilmeli':'Düşük boşluk')]; break; } case 'step-motor-isinma-gucsuzluk-teshis-araci': { var mi=num(form,'motor_current_a')||1, di=num(form,'driver_current_a'), v=num(form,'supply_voltage_v'), ms=num(form,'microstep'), rpm=num(form,'motor_rpm'), symptom=num(form,'symptom')||1; var currentRatio=di/mi*100; var speedRisk=rpm/800*50; var voltHelp=v>=48?0:25; var risk=(Math.abs(currentRatio-100)*0.5)+speedRisk+voltHelp+(ms>16?15:0)*symptom; r=[add('Akım ayarı oranı', currentRatio, '%', currentRatio>115?'Akım yüksek olabilir':(currentRatio<70?'Akım düşük olabilir':'Makul')), add('Hız/voltaj risk puanı', risk, '/100', risk>100?'Risk yüksek':'Ön kontrol'), add('Besleme voltajı', v, 'V', v<36?'Yüksek hızda tork zayıf kalabilir':'')]; break; } case 'inverter-hata-on-teshis-araci': { var mc=num(form,'motor_current_a')||1, meas=num(form,'measured_current_a'), acc=num(form,'accel_time_s'), ft=num(form,'fault_type')||1; var load=meas/mc*100; var risk=(load>100?(load-100)*2:0)+(acc<3?35:0)*ft; r=[add('Motor akım yük oranı', load, '%', load>100?'Etiket akımı aşılıyor':'Makul'), add('Hata risk puanı', risk, '/100', risk>80?'Parametre ve mekanik kontrol gerekli':'Ön kontrol'), add('Hızlanma süresi', acc, 'sn', acc<3?'Çok kısa olabilir':'')]; break; } case 'servo-alarm-on-teshis-araci': { var ir=num(form,'inertia_ratio'), acc=num(form,'acceleration'), load=num(form,'load_percent'), fe=num(form,'following_error'), sy=num(form,'symptom')||1; var risk=(ir>5?(ir-5)*8:0)+(acc*8)+(load>90?(load-90)*2:0)+(fe>0?20:0)*sy; r=[add('Servo alarm risk puanı', risk, '/100', risk>100?'Yüksek risk':'Ön kontrol'), add('Atalet oranı', ir, '', ir>10?'Tuning zor olabilir':''), add('Yük oranı', load, '%', load>90?'Sınırda':'')]; break; } case 'grbl-steps-mm-hesaplayici': { var st=num(form,'motor_steps'), mic=num(form,'microstep'), travel=num(form,'travel_per_rev_mm')||1, cmd=num(form,'command_mm')||1, meas=num(form,'measured_mm')||1; var theoretical=st*mic/travel; var corrected=theoretical*cmd/meas; r=[add('Teorik GRBL steps/mm', theoretical, 'step/mm', '$100/$101/$102 başlangıç'), add('Ölçüme göre düzeltilmiş değer', corrected, 'step/mm', ''), add('Ölçüm hata oranı', (meas-cmd)/cmd*100, '%', '')]; break; } case 'grbl-ivme-hiz-ayar-hesaplayici': { var spm=num(form,'steps_per_mm')||1, hz=num(form,'max_pulse_hz'), rpm=num(form,'motor_max_rpm'), travel=num(form,'travel_per_rev_mm'), mq=num(form,'machine_quality')||1; var speedPulse=hz/spm*60; var speedMotor=rpm*travel; var safe=Math.min(speedPulse,speedMotor)*0.75*mq; var accel=500*mq*Math.min(2,travel/40); r=[add('Pulse sınırına göre maksimum hız', speedPulse, 'mm/dk', ''), add('Motor devrine göre maksimum hız', speedMotor, 'mm/dk', ''), add('Önerilen GRBL maksimum hız', safe, 'mm/dk', '$110/$111 için başlangıç'), add('Önerilen başlangıç ivme', accel, 'mm/sn²', '$120/$121 için başlangıç')]; break; } case 'cnc-fason-kesim-fiyat-hesaplayici': { var ct=num(form,'cut_time_min'), setup=num(form,'setup_time_min'), hc=num(form,'machine_hour_cost'), mat=num(form,'material_cost'), tool=num(form,'tool_cost'), elec=num(form,'electric_cost'), profit=num(form,'profit_percent')/100; var timeCost=(ct+setup)/60*hc; var cost=timeCost+mat+tool+elec; var price=cost*(1+profit); r=[add('Süre maliyeti', timeCost, 'TL', ''), add('Toplam maliyet', cost, 'TL', ''), add('Önerilen satış fiyatı', price, 'TL', ''), add('Net kar', price-cost, 'TL', '')]; break; } case 'plaka-parca-adet-fire-hesaplayici': { var sx=num(form,'sheet_x_mm'), sy=num(form,'sheet_y_mm'), px=num(form,'part_x_mm'), py=num(form,'part_y_mm'), gap=num(form,'gap_mm'), margin=num(form,'edge_margin_mm'); var ax=Math.floor((sx-2*margin+gap)/(px+gap))*Math.floor((sy-2*margin+gap)/(py+gap)); var rot=Math.floor((sx-2*margin+gap)/(py+gap))*Math.floor((sy-2*margin+gap)/(px+gap)); var best=Math.max(ax,rot); var used=best*px*py; var area=sx*sy; r=[add('Düz yerleşim adet', ax, 'adet', ''), add('Döndürülmüş yerleşim adet', rot, 'adet', ''), add('En iyi yaklaşık adet', best, 'adet', ''), add('Yaklaşık alan verimi', used/area*100, '%', '')]; break; } case 'nest-verimlilik-hesaplayici': { var sheet=num(form,'sheet_area_m2')||1, parts=num(form,'parts_area_m2'), cost=num(form,'sheet_cost'), rec=num(form,'scrap_recovery_percent')/100; var eff=parts/sheet*100; var waste=Math.max(0,sheet-parts)/sheet*cost*(1-rec); r=[add('Nest verimi', eff, '%', eff<70?'Fire yüksek olabilir':'Makul'), add('Fire oranı', 100-eff, '%', ''), add('Net fire maliyeti', waste, 'TL', '')]; break; } case 'kesim-metresi-fiyat-hesaplayici': { var len=num(form,'cut_length_m')||1, feed=num(form,'feed_mm_min'), setup=num(form,'setup_min'), hour=num(form,'machine_hour_cost'), profit=num(form,'profit_percent')/100; var cutMin=len*1000/feed; var cost=(cutMin+setup)/60*hour; var price=cost*(1+profit); r=[add('Net kesim süresi', cutMin, 'dk', ''), add('Toplam süre maliyeti', cost, 'TL', ''), add('Önerilen toplam satış', price, 'TL', ''), add('Metre başı satış fiyatı', price/len, 'TL/m', '')]; break; } case 'cnc-parametre-deneme-planlayici': { var rpm=num(form,'start_rpm'), feed=num(form,'start_feed'), step=num(form,'step_percent')/100, cnt=Math.min(10,Math.max(1,Math.round(num(form,'test_count')))), mode=form.elements['change_mode']?form.elements['change_mode'].value:'feed'; var lastFeed=feed*Math.pow(1+step,cnt-1), lastRpm=rpm*Math.pow(1+step,cnt-1); r=[add('1. deneme RPM', rpm, 'rpm', ''), add('1. deneme F', feed, 'mm/dk', ''), add('Son deneme RPM', mode==='feed'?rpm:lastRpm, 'rpm', ''), add('Son deneme F', mode==='rpm'?feed:lastFeed, 'mm/dk', cnt+' kademeli plan')]; break; } case 'spindle-yuk-akim-izleme-hesabi': { var rated=num(form,'rated_current_a')||1, cut=num(form,'cut_current_a'), idle=num(form,'idle_current_a'), duty=num(form,'duty_type')||1; var net=Math.max(0,cut-idle); var usable=Math.max(0.1,rated-idle); var load=net/usable*100/duty; r=[add('Net kesim akımı', net, 'A', ''), add('Tahmini spindle yük oranı', load, '%', load>85?'Yüksek yük':'Makul'), add('Etiket akımına oran', cut/rated*100, '%', '')]; break; } case 'vakum-deligi-aralik-on-hesabi': { var tx=num(form,'table_x_mm'), ty=num(form,'table_y_mm'), dia=num(form,'hole_diameter_mm'), pitch=num(form,'hole_pitch_mm'), zone=num(form,'zone_count')||1; var nx=Math.floor(tx/pitch)+1, ny=Math.floor(ty/pitch)+1, count=nx*ny, open=count*PI*Math.pow(dia/2,2)/1000000; r=[add('Yaklaşık delik sayısı', count, 'adet', ''), add('Toplam açık delik alanı', open*10000, 'cm²', ''), add('Bölge başı alan', tx*ty/zone/1000000, 'm²', '')]; break; } default: r = []; } r = enhanceSahaResults(form, r); render(form, r); } function sanitizeAiHtml(html){ var tpl = document.createElement('template'); tpl.innerHTML = String(html || ''); var allowed = {BR:1,P:1,DIV:1,SPAN:1,STRONG:1,B:1,EM:1,I:1,UL:1,OL:1,LI:1,TABLE:1,THEAD:1,TBODY:1,TFOOT:1,TR:1,TH:1,TD:1,A:1}; function clean(node){ Array.prototype.slice.call(node.childNodes).forEach(function(child){ if(child.nodeType === 1){ if(!allowed[child.tagName]){ child.replaceWith(document.createTextNode(child.textContent || '')); return; } Array.prototype.slice.call(child.attributes).forEach(function(attr){ var name = attr.name.toLowerCase(); var ok = (child.tagName === 'A' && ['href','target','rel','title'].indexOf(name) !== -1) || ((child.tagName === 'TD' || child.tagName === 'TH') && ['colspan','rowspan'].indexOf(name) !== -1); if(name.indexOf('on') === 0 || !ok){ child.removeAttribute(attr.name); } }); if(child.tagName === 'A'){ var href = child.getAttribute('href') || ''; try{ var u = new URL(href, window.location.origin); if(['http:','https:','mailto:','tel:'].indexOf(u.protocol) === -1 && href.charAt(0) !== '#'){ child.removeAttribute('href'); } }catch(e){ if(href.charAt(0) !== '#'){ child.removeAttribute('href'); } } if(child.getAttribute('target') === '_blank'){ child.setAttribute('rel','noopener noreferrer nofollow'); } } clean(child); } else if(child.nodeType !== 3){ child.remove(); } }); } clean(tpl.content); return tpl.innerHTML; } function collectPageContext(wrap){ var lines = []; var title = wrap.querySelector('h1') ? wrap.querySelector('h1').textContent.trim() : ''; var category = wrap.querySelector('.mthc-eyebrow') ? wrap.querySelector('.mthc-eyebrow').textContent.trim() : ''; if(title){ lines.push('Başlık: ' + title); } if(category){ lines.push('Kategori: ' + category); } var form = wrap.querySelector('.mthc-form[data-mthc-calc]'); if(form){ lines.push('Girilen değerler:'); collectFormRows(form).forEach(function(row){ lines.push('- ' + row.label + ': ' + row.value); }); } var cards = Array.prototype.map.call(wrap.querySelectorAll('.mthc-result-card'), function(card){ return card.textContent.replace(/\s+/g,' ').trim(); }); if(cards.length){ lines.push('Hesap sonucu:'); cards.forEach(function(x){ lines.push('- ' + x); }); } var advisor = wrap.querySelector('[data-mthc-advisor]'); if(advisor){ lines.push('Karar özeti: ' + advisor.textContent.replace(/\s+/g,' ').trim()); } var match = wrap.querySelector('[data-mthc-product-match]'); if(match){ lines.push('Ürün eşleştirme: ' + match.textContent.replace(/\s+/g,' ').trim()); } var products = Array.prototype.map.call(wrap.querySelectorAll('[data-mthc-product-target]'), function(a){ return (a.getAttribute('data-mthc-product-label') || a.textContent).replace(/\s+/g,' ').trim() + ' => ' + a.href; }); if(products.length){ lines.push('Doğrudan ürün/kategori bağlantıları:'); products.slice(0,5).forEach(function(x){ lines.push('- ' + x); }); } return lines.join('\n').slice(0,5000); } function initAiPanels(){ document.querySelectorAll('[data-mthc-ai-panel]').forEach(function(panel){ if(panel.getAttribute('data-ai-ready')){ return; } panel.setAttribute('data-ai-ready','1'); var wrap = panel.closest('.mthc-wrap') || document; var textarea = panel.querySelector('[data-mthc-ai-text]'); var answer = panel.querySelector('[data-mthc-ai-answer]'); var send = panel.querySelector('[data-mthc-ai-send]'); var clear = panel.querySelector('[data-mthc-ai-clear]'); var quicks = panel.querySelectorAll('[data-mthc-ai-question]'); Array.prototype.forEach.call(quicks, function(btn){ btn.addEventListener('click', function(){ if(textarea){ textarea.value = btn.getAttribute('data-mthc-ai-question') || ''; textarea.focus(); } }); }); if(clear){ clear.addEventListener('click', function(){ if(answer){ answer.innerHTML = 'Yanıt temizlendi. Yeni bir soru sorabilirsiniz.'; } }); } if(!send || !textarea || !answer){ return; } send.addEventListener('click', function(){ var question = textarea.value.trim(); if(!question){ textarea.focus(); return; } var url = panel.getAttribute('data-mthc-ai-url') || ''; var nonce = panel.getAttribute('data-mthc-ai-nonce') || ''; var title = panel.getAttribute('data-mthc-ai-title') || ''; var slug = panel.getAttribute('data-mthc-ai-slug') || ''; var fd = new FormData(); fd.append('action','mthc_calc_ai_support'); fd.append('nonce', nonce); fd.append('title', title); fd.append('slug', slug); fd.append('question', question); fd.append('context', collectPageContext(wrap)); fd.append('website',''); send.disabled = true; answer.classList.add('mthc-ai-loading'); answer.innerHTML = 'Sayfa sonucu ve girilen değerler okunuyor; teknik yanıt hazırlanıyor...'; fetch(url, {method:'POST', body:fd, credentials:'same-origin'}) .then(function(res){ return res.json(); }) .then(function(json){ if(!json || !json.success || !json.data || !json.data.answer){ throw new Error(json && json.data && json.data.message ? json.data.message : 'Yanıt alınamadı.'); } answer.innerHTML = sanitizeAiHtml(json.data.answer); }) .catch(function(err){ answer.innerHTML = '' + escapeHtml(err.message || 'Teknik yardım servisine ulaşılamadı. Sonucu WhatsApp ile gönderebilirsiniz.') + ''; }) .finally(function(){ send.disabled = false; answer.classList.remove('mthc-ai-loading'); }); }); textarea.addEventListener('keydown', function(e){ if((e.ctrlKey || e.metaKey) && e.key === 'Enter'){ e.preventDefault(); send.click(); } }); }); } function resetForm(form){ Array.prototype.forEach.call(form.elements, function(el){ if(!el.name){ return; } if(el.hasAttribute('data-default')){ el.value = el.getAttribute('data-default'); } }); calculate(form); } function sendUsage(wrap, eventName){ if(!wrap){ return; } var url = wrap.getAttribute('data-mthc-ajax') || ''; var nonce = wrap.getAttribute('data-mthc-usage-nonce') || ''; var slug = wrap.getAttribute('data-mthc-wrap') || ''; if(!url || !nonce || !slug){ return; } var fd = new FormData(); fd.append('action','mthc_usage_event'); fd.append('nonce', nonce); fd.append('slug', slug); fd.append('event', eventName || 'view'); if(navigator.sendBeacon){ navigator.sendBeacon(url, fd); } else { fetch(url, {method:'POST', body:fd, credentials:'same-origin'}).catch(function(){}); } } function collectSummary(wrap){ var form = wrap.querySelector('.mthc-form[data-mthc-calc]'); var lines = []; var title = wrap.querySelector('h1') ? wrap.querySelector('h1').textContent.trim() : ''; if(title){ lines.push(title); } if(form){ collectFormRows(form).forEach(function(r){ lines.push(r.label + ': ' + r.value); }); } Array.prototype.forEach.call(wrap.querySelectorAll('.mthc-result-card'), function(card){ lines.push(card.textContent.replace(/\s+/g,' ').trim()); }); var adv = wrap.querySelector('[data-mthc-advisor]'); if(adv){ lines.push(adv.textContent.replace(/\s+/g,' ').trim()); } var cls = wrap.querySelector('[data-mthc-class-recommendation]'); if(cls){ lines.push(cls.textContent.replace(/\s+/g,' ').trim()); } return lines.join('\n').slice(0,4000); } function initQuotePanels(){ document.querySelectorAll('[data-mthc-quote-panel]').forEach(function(panel){ if(panel.getAttribute('data-ready')){ return; } panel.setAttribute('data-ready','1'); var wrap = panel.closest('.mthc-wrap'); var btn = panel.querySelector('[data-mthc-quote-send]'); var status = panel.querySelector('[data-mthc-quote-status]'); if(!wrap || !btn){ return; } btn.addEventListener('click', function(){ var url = wrap.getAttribute('data-mthc-ajax') || ''; var nonce = wrap.getAttribute('data-mthc-quote-nonce') || ''; var fd = new FormData(); fd.append('action','mthc_quote_request'); fd.append('nonce', nonce); fd.append('slug', btn.getAttribute('data-mthc-slug') || wrap.getAttribute('data-mthc-wrap') || ''); fd.append('title', btn.getAttribute('data-mthc-title') || (wrap.querySelector('h1') ? wrap.querySelector('h1').textContent : '')); fd.append('name', (panel.querySelector('[data-mthc-quote-name]') || {}).value || ''); fd.append('phone', (panel.querySelector('[data-mthc-quote-phone]') || {}).value || ''); fd.append('message', (panel.querySelector('[data-mthc-quote-message]') || {}).value || ''); fd.append('website', (panel.querySelector('[data-mthc-quote-website]') || {}).value || ''); fd.append('summary', collectSummary(wrap)); fd.append('url', window.location.href); btn.disabled = true; if(status){ status.textContent = 'Talep kaydediliyor...'; } fetch(url, {method:'POST', body:fd, credentials:'same-origin'}) .then(function(r){ return r.json(); }) .then(function(json){ if(!json || !json.success){ throw new Error(json && json.data && json.data.message ? json.data.message : 'Talep kaydedilemedi.'); } if(status){ status.textContent = json.data.message || 'Talep kaydedildi.'; } sendUsage(wrap, 'quote'); }) .catch(function(e){ if(status){ status.textContent = e.message || 'Talep kaydedilemedi.'; } }) .finally(function(){ btn.disabled = false; }); }); }); } function initHelpPanels(){ var mq = window.matchMedia ? window.matchMedia('(max-width: 760px)') : {matches:false, addEventListener:function(){}}; function updateLabel(panel){ var btn = panel.querySelector('[data-mthc-help-toggle]'); if(!btn){ return; } var span = btn.querySelector('span'); var open = panel.hasAttribute('open'); if(span){ span.textContent = open ? 'Alan açıklamalarını gizle' : 'Alan açıklamalarını göster'; } btn.setAttribute('aria-expanded', open ? 'true' : 'false'); } document.querySelectorAll('[data-mthc-help-panel]').forEach(function(panel){ if(panel.getAttribute('data-mthc-help-ready')){ return; } panel.setAttribute('data-mthc-help-ready','1'); if(panel.tagName && panel.tagName.toLowerCase() === 'details'){ if(mq.matches){ panel.removeAttribute('open'); } else { panel.setAttribute('open','open'); } updateLabel(panel); panel.addEventListener('toggle', function(){ updateLabel(panel); }); } }); document.querySelectorAll('.mthc-field-help-list').forEach(function(list){ if(list.getAttribute('data-mthc-accordion-ready')){ return; } list.setAttribute('data-mthc-accordion-ready','1'); list.querySelectorAll('.mthc-help-item').forEach(function(item){ item.addEventListener('toggle', function(){ if(!item.open){ return; } list.querySelectorAll('.mthc-help-item').forEach(function(other){ if(other !== item){ other.removeAttribute('open'); } }); }); }); }); document.querySelectorAll('.mthc-form').forEach(function(form){ if(form.getAttribute('data-mthc-inline-help-ready')){ return; } form.setAttribute('data-mthc-inline-help-ready','1'); form.querySelectorAll('[data-mthc-inline-help]').forEach(function(item){ item.addEventListener('toggle', function(){ if(!item.open){ return; } form.querySelectorAll('[data-mthc-inline-help]').forEach(function(other){ if(other !== item){ other.removeAttribute('open'); } }); }); }); }); document.querySelectorAll('[data-mthc-jump-help]').forEach(function(link){ if(link.getAttribute('data-mthc-jump-ready')){ return; } link.setAttribute('data-mthc-jump-ready','1'); link.addEventListener('click', function(e){ var id = link.getAttribute('data-mthc-jump-help') || ''; var target = id ? document.getElementById(id) : null; var panel = target ? target.closest('[data-mthc-help-panel]') : null; if(panel && panel.tagName && panel.tagName.toLowerCase() === 'details'){ panel.setAttribute('open','open'); updateLabel(panel); } if(target && target.tagName && target.tagName.toLowerCase() === 'details'){ target.setAttribute('open','open'); setTimeout(function(){ target.scrollIntoView({behavior:'smooth', block:'center'}); }, 60); } }); }); } function init(){ document.querySelectorAll('.mthc-form[data-mthc-calc]').forEach(function(form){ form.addEventListener('submit', function(e){ e.preventDefault(); calculate(form); }); form.addEventListener('input', function(){ calculate(form); }); form.addEventListener('change', function(){ calculate(form); }); var reset = form.querySelector('[data-mthc-reset]'); if(reset){ reset.addEventListener('click', function(){ resetForm(form); }); } calculate(form); }); initHelpPanels(); initAiPanels(); initQuotePanels(); document.querySelectorAll('.mthc-wrap[data-mthc-wrap]').forEach(function(wrap){ if(!wrap.getAttribute('data-view-counted')){ wrap.setAttribute('data-view-counted','1'); sendUsage(wrap, 'view'); } }); document.querySelectorAll('[data-mthc-print]').forEach(function(btn){ btn.addEventListener('click', function(){ var wrap = btn.closest('.mthc-wrap'); var form = wrap ? wrap.querySelector('.mthc-form[data-mthc-calc]') : null; if(form){ buildReport(form); } else { window.print(); } }); }); } if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); //# sourceURL=mthc-script-js-after