C# týden ITnetwork Flashka zdarma
Akce! Pouze tento týden sleva až 80 % na kurzy C# .NET. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: V čem napsat 3d program

Aktivity (4)
Avatar
jklasdf
Člen
Avatar
jklasdf:9. února 17:48

Dobrý den.
Chtěl bych napsat program na ovládání cnc frézky, aby vytvořila přední desku houslí.

Měl by fungovat nějak takto:

  1. Nakreslím si desku, ze které budu obrábět.
  2. Nakreslím výsledný tvar ve 3d.

To bych chtěl dělat tak, že si na papír obkreslím boky houslí (u každých houslí jsou nepatrně jiné). Naskenuju to. To mně určí 2d tvar desky. Zadám výšku třeba 2 cm a vytvořím 3d objekt. Pomocí nástroje "škrabátka" budu na počítači ztenčovat desku a tvarovat klenbu (vlastně by to mělo napodobovat postup, jak když to houslař dělá ručně. Nenapadl mě žádný lepší způsob). Když budu mít desku z vrchu obrobenou, zadám ztenčení na např. 3 mm a obrobí se mně zespodu. "Škrabátkem to zespodu doškrábu (v prostředu je tloušťka desky silnější, na krajích tenší). Chtěl bych změnit barvu míst desky, podle tloušťky, abych věděl, kde mám ještě škrábat.

  1. Zvolím frézovací vrták a postup obrábění.

V čem to napsat?
Trochu (opravdu trochu) umím c#, ale když to bude lepší v něčem jiném, tak to možná zkusím v tom.
Zkoušel jsem něco v c# a wpf - oddálit kameru a otáčet 3d objektem a chovalo se to nějak divně (možná jsem udělal někde chybu), tak možná wpf není to pravé. Na tvorbu menu, by bylo zase dobré.
Kdyby náhodou takový program už existoval a byl zadarmo, že bych to nemusel psát, nezlobil bych se. Ale asi to budu muset napsat, tak mně poraďte, v čem by to bylo nejlepší.

 
Odpovědět 9. února 17:48
Avatar
Ghst
Člen
Avatar
Odpovídá na jklasdf
Ghst:11. února 19:45

Chápu dobře, že se snažíš napsat vlastní řídící systém CNC?

Nebo se snažíš napsat program, ve kterém budeš modelovat výrobek, výstupem programu pak bude program pro stroj ?

Nebylo by lepší použít již existující řešení? Generování programu z 3d modelu/ CAD výkresu uměli stroje již před mnoho lety.

 
Nahoru Odpovědět 11. února 19:45
Avatar

Člen
Avatar
:12. února 13:25

Tak už z podstaty CNC by měl být k uvažovanému stroji k dispozici nějaký tracer, který převádí vstupní "výkres" na pohyb vřetena/frézky.
Pak je otázka proč psát vlastní "design" software, když stačí vzít ten výrobcův tracer a poslat mu data ve formátu, které je schopen převést - a ten formát udělat pomocí editoru, který jistě že už bude existovat.
Berme však v potaz to, že máte stroj, bez dokumentace a SW.
Myslím ale, že bude třeba tuto část trošičku standartizovat viz příspěvek Ghst. Psát software na malování tvaru houslí při nízké znalosti právě programování mi přijde jako příliš velký krajíc. Měříte schopnosti jazyka na to, zdali umí "menu" nebo "3d kreslení".
Myslím, že byste se měl ubírat cestou výrobce CNC => software výrobce CNC a až pak zjišťovat, jaký formát dat tomu dodat.
Váš budoucí SW pak může být jednoduchý "kreslítko" s exportem do nějakého schůdného formátu, ale to podle mě budete vynalézat kolo znovu.
Bez znalosti rozhraní toho CNC, pokud chcete rovnou dělat konverzi z "kreslítka" do "číslicového řízení" férzky to budete mít těžké. Vaše kreslítko navíc budete muset obohatit o speciální značky a povely pro např. otáčky, pohybu v Z rovině, spínání chlazení anebo rychlost posuvu apod.
Jestli tohle všechno máte pohromadě, pak to kreslítko nebude takový problém... A jazyk, kterým to napíšete je to poslední nad čím budete muset přemýšlet. Můžete přiložit alespon to co už máte? Vcelku jsem zvědav.

 
Nahoru Odpovědět 12. února 13:25
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na jklasdf
David Hynek:12. února 14:33

Ty už 3D frézku máš? A ta je bez ovládacího softweru? K ovládání můžu doporučit MACH4, pro vytvoření trasování pak sheetcam.com a co se vstupních dat týká, tak model můžeš vytvořit i v Blenderu.

Nahoru Odpovědět 12. února 14:33
Čím víc vím, tím víc věcí nevím.
Avatar
jklasdf
Člen
Avatar
jklasdf:12. února 20:26

Snažím se napsat program, ve kterém budu modelovat výrobek, výstupem bude program pro stroj. Nechci, aby mě modelování výrobku zabralo víc jak 10 minut. Nevím o cad programu, co by fungoval tak, jak jsem popsal. Na houslích není nic rovné a dělat to podle křivek a čísel by podle mě zabralo víc času, než udělat desku ručně bez počítače. Nepotřebuju to kreslit jenom jednou, chci tam měnit výšku klenby a do šířky to nikdy není stejné. Možná Blender je ten program, co potřebuju. Ještě nevím.
Frézka to má být hobby podobná této, akorát větší:
http://www.abetec.cz/…c-sestavena/
Chci si ji postavit sám podle návodu na internetu:
https://www.youtube.com/watch?…
Jediné, co bude řídit počítač bude posuv. K ovládání jsem chtěl použít GRBL podle návodu. To mně samotné nestačí, proto jsem chtěl psát program. Když dojdu k závěru, že tu frézku nebudu mít jak ovládat, nebudu ji stavět.

I kdybych našel program, jak to ovládat (třeba ten Blender by na to stačil), stejně bych chtěl vědět, co se používá na 3D.
c# + SharpDX v tom by to šlo?

Tady jsem si jenom něco zkoušel. Program přímo jsem nezačal psát, jenom jsem zkoumal, jak 3D ve wpf funguje:

using System;
using System.Collec­tions.Generic;
using System.Linq;
using System.Text;
using System.Threadin­g.Tasks;
using System.Windows;
using System.Window­s.Controls;
using System.Window­s.Data;
using System.Window­s.Documents;
using System.Window­s.Input;
using System.Window­s.Media;
using System.Window­s.Media.Imagin­g;
using System.Window­s.Navigation;
using System.Window­s.Shapes;
using System.Window­s.Media.Media3D;

namespace WPFChart
{
/// <summary>
/// Interakční logika pro MainWindow.xaml
/// </summary>
public partial class Window1 : Window
{
//camera.Position = new Point3D(x, y, z);
// Reference to the geometry for later use
public Window1()
{
InitializeCom­ponent();

/*System.Window­s.Media.Media3D­.Point3D point0 = new Point3D(-0.5, 0, 0);
System.Window­s.Media.Media3D­.Point3D point1 = new Point3D(0.5, 0.5, 0.3);
System.Window­s.Media.Media3D­.Point3D point2 = new Point3D(0, 0.5, 0);

System.Window­s.Media.Media3D­.MeshGeometry3D triangleMesh = new MeshGeometry3D();

triangleMesh.Po­sitions.Add(po­int0);
triangleMesh.Po­sitions.Add(po­int1);
triangleMesh.Po­sitions.Add(po­int2);

int n0 = 0;
int n1 = 1;
int n2 = 2;

triangleMesh.Tri­angleIndices.Ad­d(n0);
triangleMesh.Tri­angleIndices.Ad­d(n1);
triangleMesh.Tri­angleIndices.Ad­d(n2);

System.Window­s.Media.Media3D­.Vector3D norm = new Vector3D(0, 0, 1);
triangleMesh.Nor­mals.Add(norm);
triangleMesh.Nor­mals.Add(norm);
triangleMesh.Nor­mals.Add(norm);

System.Window­s.Media.Media3D­.Material frontMaterial =
new DiffuseMaterial(new SolidColorBrush(Co­lors.Blue));

System.Window­s.Media.Media3D­.GeometryModel3D triangleModel =
new GeometryModel3D(tri­angleMesh, frontMaterial);

triangleModel­.Transform = new Transform3DGroup();

System.Window­s.Media.Media3D­.ModelVisual3D visualModel = new ModelVisual3D();
visualModel.Content = triangleModel;

this.mainView­port.Children­.Add(visualMo­del);*/

// Define 3D mesh object
MeshGeometry3D mesh = new MeshGeometry3D();
// Front face
mesh.Position­s.Add(new Point3D(-0.5, -0.5, 1));
mesh.Position­s.Add(new Point3D(0.5, -0.5, 1));
mesh.Position­s.Add(new Point3D(0.5, 0.5, 1));
mesh.Position­s.Add(new Point3D(-0.5, 0.5, 1));
// Back face
mesh.Position­s.Add(new Point3D(-1, -1, -1));
mesh.Position­s.Add(new Point3D(1, -1, -1));
mesh.Position­s.Add(new Point3D(1, 1, -1));
mesh.Position­s.Add(new Point3D(-1, 1, -1));

// Front face
mesh.Triangle­Indices.Add(0);
mesh.Triangle­Indices.Add(1);
mesh.Triangle­Indices.Add(2);
mesh.Triangle­Indices.Add(2);
mesh.Triangle­Indices.Add(3);
mesh.Triangle­Indices.Add(0);
// Back face
mesh.Triangle­Indices.Add(6);
mesh.Triangle­Indices.Add(5);
mesh.Triangle­Indices.Add(4);
mesh.Triangle­Indices.Add(4);
mesh.Triangle­Indices.Add(7);
mesh.Triangle­Indices.Add(6);
// Right face
mesh.Triangle­Indices.Add(1);
mesh.Triangle­Indices.Add(5);
mesh.Triangle­Indices.Add(2);
mesh.Triangle­Indices.Add(5);
mesh.Triangle­Indices.Add(6);
mesh.Triangle­Indices.Add(2);
// Other faces (see complete source code)...
mesh.Position­s.Add(new Point3D(-0.5, -0.5, -0.5));
mesh.Position­s.Add(new Point3D(-0.5, 0.5, -0.5));
mesh.Position­s.Add(new Point3D(0.5, 0.5, -0.5));
mesh.Position­s.Add(new Point3D(0.5, 0.5, -0.5));
mesh.Position­s.Add(new Point3D(0.5, -0.5, -0.5));
mesh.Position­s.Add(new Point3D(-0.5, -0.5, -0.5));

mesh.Triangle­Indices.Add(0);
mesh.Triangle­Indices.Add(1);
mesh.Triangle­Indices.Add(2);
mesh.Triangle­Indices.Add(3);
mesh.Triangle­Indices.Add(4);
mesh.Triangle­Indices.Add(5);

mesh.Normals.Ad­d(new Vector3D(0, 0, -1));
mesh.Normals.Ad­d(new Vector3D(0, 0, -1));
mesh.Normals.Ad­d(new Vector3D(0, 0, -1));
mesh.Normals.Ad­d(new Vector3D(0, 0, -1));
mesh.Normals.Ad­d(new Vector3D(0, 0, -1));
mesh.Normals.Ad­d(new Vector3D(0, 0, -1));

mesh.TextureCo­ordinates.Add(new Point(1, 0));
mesh.TextureCo­ordinates.Add(new Point(1, 1));
mesh.TextureCo­ordinates.Add(new Point(0, 1));
mesh.TextureCo­ordinates.Add(new Point(0, 1));
mesh.TextureCo­ordinates.Add(new Point(0, 0));
mesh.TextureCo­ordinates.Add(new Point(1, 0));
// Geometry creation
mGeometry = new GeometryModel3D(mesh, new DiffuseMateri­al(Brushes.Ye­llowGreen));
mGeometry.Transform = new Transform3DGroup();
group.Children­.Add(mGeometry);
}
private GeometryModel3D mGeometry;
private bool mDown;
private Point mLastPos;

private void Grid_MouseWhe­el(object sender, MouseWheelEventArgs e)
{
camera.Position = new Point3D(
camera.Position.X,
camera.Position.Y,
camera.Position.Z - e.Delta / 1000D);
}

private void Grid_MouseDow­n(object sender, MouseButtonEven­tArgs e)
{
if (e.LeftButton != MouseButtonSta­te.Pressed) return;
mDown = true;
Point pos = Mouse.GetPosi­tion(mainView­port);
mLastPos = new Point(
pos.X - mainViewport.Ac­tualWidth / 2,
mainViewport.Ac­tualHeight / 2 - pos.Y);
}

private void Grid_MouseUp(object sender, MouseButtonEven­tArgs e)
{
mDown = false;
}

private void Grid_MouseMove(ob­ject sender, MouseEventArgs e)
{
if (!mDown) return;
Point pos = Mouse.GetPosi­tion(mainView­port);
Point actualPos = new Point(
pos.X - mainViewport.Ac­tualWidth / 2,
mainViewport.Ac­tualHeight / 2 - pos.Y);
double dx = actualPos.X - mLastPos.X;
double dy = actualPos.Y - mLastPos.Y;
double mouseAngle = 0;

if (dx != 0 && dy != 0)
{
mouseAngle = Math.Asin(Mat­h.Abs(dy) /
Math.Sqrt(Mat­h.Pow(dx, 2) + Math.Pow(dy, 2)));
if (dx < 0 && dy > 0) mouseAngle += Math.PI / 2;
else if (dx < 0 && dy < 0) mouseAngle += Math.PI;
else if (dx > 0 && dy < 0) mouseAngle += Math.PI * 1.5;
}
else if (dx == 0 && dy != 0)
{
mouseAngle = Math.Sign(dy) > 0 ? Math.PI / 2 : Math.PI * 1.5;
}
else if (dx != 0 && dy == 0)
{
mouseAngle = Math.Sign(dx) > 0 ? 0 : Math.PI;
}

double axisAngle = mouseAngle + Math.PI / 2;

Vector3D axis = new Vector3D(
Math.Cos(axisAngle) * 4,
Math.Sin(axisAngle) * 4, 0);

double rotation = 0.02 *
Math.Sqrt(Mat­h.Pow(dx, 2) + Math.Pow(dy, 2));

Transform3DGroup group = mGeometry.Transform as Transform3DGroup;
QuaternionRota­tion3D r =
new QuaternionRota­tion3D(
new Quaternion(axis, rotation * 180 / Math.PI));
group.Children­.Add(new RotateTransfor­m3D(r));

mLastPos = actualPos;
}

}
}

 
Nahoru Odpovědět 12. února 20:26
Avatar

Člen
Avatar
:13. února 10:04

Mno podle odkazu jsem našel že SW nějaký k frézám nabízejí a cena není likvidační, nějakých 2500,- jestli jsem správně viděl.
Import tam jde z vektorových programů, často zmiňují třeba Corel Draw. A do Corela lze v klidu nahrát podkladový naskenovaný obrázek a obtáhnout ho vektorovýma křivka, to nebude problém.
Škálovat dle vašich požadavků by problém být taky v Corelu neměl. Takže šup, kupte frézku, nějaký vhodný základní trejsovací soft co nabízej a na ulož.to toho Corela ;). V Corelu nakreslíte, uložíte, naimportujete do SW od frézky a jede se... mě to nepřijde jako problém.
V opačném případě budete muset ve vašem SW řešit všechno to, co je otázkou rozhraní té frézy. A dělat navíc vlastní 3D kreslítko.
Nechce náhodou raději spíš rozebrat export z trejsru pro frézku (určitě to bude taky nějaký sobor s povely psanými v rozhraní) a ten doplnit o nějaký mezi konvertor toho, co vám standartní 2D Corel třeba po konverzi nedá?
Mám totiž pocit, že vám ze standartní nabízených schopností, které lze s frézkou zakoupit chybí něco, co hodláte nahradit a zjednodušit pomocí vlastního SW - ale jak říkám nezahodil bych větší část práce pro získání vlastností, které mi chybí. Spíš bych šel cestou toho co se nabízí a doplnit to o to co mi chybí. Vhodným bodem se mi jevý výstupní soubor,který se nahrává do zařízení po otrejsování např. z 2D předlohy.
Corel 2D -> trejsr co je v k zařízení -> před exportem do zařízení upravit vhodně ve vlastním SW o vlastnosti, které Vám chybí.
Doplňované vlastnosti tak budou vycházet podle standartu API toho zařízení. Ale i tohle řešení je vcelku obtížné. No neporadim.

 
Nahoru Odpovědět 13. února 10:04
Avatar
jklasdf
Člen
Avatar
jklasdf:13. února 20:47

Díky za radu. Vyzkouším Corela a Blender. Nějakou dobu mně to potrvá. Nikdy jsem nedělal v těch programech.

 
Nahoru Odpovědět 13. února 20:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.