Diskuze: V čem napsat 3d program
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Ghst:11.2.2019 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.
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.
David Hynek:12.2.2019 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.
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.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.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()
{
InitializeComponent();
/*System.Windows.Media.Media3D.Point3D point0 = new Point3D(-0.5, 0,
0);
System.Windows.Media.Media3D.Point3D point1 = new Point3D(0.5, 0.5,
0.3);
System.Windows.Media.Media3D.Point3D point2 = new Point3D(0, 0.5, 0);
System.Windows.Media.Media3D.MeshGeometry3D triangleMesh = new MeshGeometry3D();
triangleMesh.Positions.Add(point0);
triangleMesh.Positions.Add(point1);
triangleMesh.Positions.Add(point2);
int n0 = 0;
int n1 = 1;
int n2 = 2;
triangleMesh.TriangleIndices.Add(n0);
triangleMesh.TriangleIndices.Add(n1);
triangleMesh.TriangleIndices.Add(n2);
System.Windows.Media.Media3D.Vector3D norm = new Vector3D(0, 0, 1);
triangleMesh.Normals.Add(norm);
triangleMesh.Normals.Add(norm);
triangleMesh.Normals.Add(norm);
System.Windows.Media.Media3D.Material frontMaterial =
new DiffuseMaterial(new SolidColorBrush(Colors.Blue));
System.Windows.Media.Media3D.GeometryModel3D triangleModel =
new GeometryModel3D(triangleMesh, frontMaterial);
triangleModel.Transform = new Transform3DGroup();
System.Windows.Media.Media3D.ModelVisual3D visualModel = new
ModelVisual3D();
visualModel.Content = triangleModel;
this.mainViewport.Children.Add(visualModel);*/
// Define 3D mesh object
MeshGeometry3D mesh = new MeshGeometry3D();
// Front face
mesh.Positions.Add(new Point3D(-0.5, -0.5, 1));
mesh.Positions.Add(new Point3D(0.5, -0.5, 1));
mesh.Positions.Add(new Point3D(0.5, 0.5, 1));
mesh.Positions.Add(new Point3D(-0.5, 0.5, 1));
// Back face
mesh.Positions.Add(new Point3D(-1, -1, -1));
mesh.Positions.Add(new Point3D(1, -1, -1));
mesh.Positions.Add(new Point3D(1, 1, -1));
mesh.Positions.Add(new Point3D(-1, 1, -1));
// Front face
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(3);
mesh.TriangleIndices.Add(0);
// Back face
mesh.TriangleIndices.Add(6);
mesh.TriangleIndices.Add(5);
mesh.TriangleIndices.Add(4);
mesh.TriangleIndices.Add(4);
mesh.TriangleIndices.Add(7);
mesh.TriangleIndices.Add(6);
// Right face
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(5);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(5);
mesh.TriangleIndices.Add(6);
mesh.TriangleIndices.Add(2);
// Other faces (see complete source code)...
mesh.Positions.Add(new Point3D(-0.5, -0.5, -0.5));
mesh.Positions.Add(new Point3D(-0.5, 0.5, -0.5));
mesh.Positions.Add(new Point3D(0.5, 0.5, -0.5));
mesh.Positions.Add(new Point3D(0.5, 0.5, -0.5));
mesh.Positions.Add(new Point3D(0.5, -0.5, -0.5));
mesh.Positions.Add(new Point3D(-0.5, -0.5, -0.5));
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(3);
mesh.TriangleIndices.Add(4);
mesh.TriangleIndices.Add(5);
mesh.Normals.Add(new Vector3D(0, 0, -1));
mesh.Normals.Add(new Vector3D(0, 0, -1));
mesh.Normals.Add(new Vector3D(0, 0, -1));
mesh.Normals.Add(new Vector3D(0, 0, -1));
mesh.Normals.Add(new Vector3D(0, 0, -1));
mesh.Normals.Add(new Vector3D(0, 0, -1));
mesh.TextureCoordinates.Add(new Point(1, 0));
mesh.TextureCoordinates.Add(new Point(1, 1));
mesh.TextureCoordinates.Add(new Point(0, 1));
mesh.TextureCoordinates.Add(new Point(0, 1));
mesh.TextureCoordinates.Add(new Point(0, 0));
mesh.TextureCoordinates.Add(new Point(1, 0));
// Geometry creation
mGeometry = new GeometryModel3D(mesh, new
DiffuseMaterial(Brushes.YellowGreen));
mGeometry.Transform = new Transform3DGroup();
group.Children.Add(mGeometry);
}
private GeometryModel3D mGeometry;
private bool mDown;
private Point mLastPos;
private void Grid_MouseWheel(object sender, MouseWheelEventArgs e)
{
camera.Position = new Point3D(
camera.Position.X,
camera.Position.Y,
camera.Position.Z - e.Delta / 1000D);
}
private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed) return;
mDown = true;
Point pos = Mouse.GetPosition(mainViewport);
mLastPos = new Point(
pos.X - mainViewport.ActualWidth / 2,
mainViewport.ActualHeight / 2 - pos.Y);
}
private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
{
mDown = false;
}
private void Grid_MouseMove(object sender, MouseEventArgs e)
{
if (!mDown) return;
Point pos = Mouse.GetPosition(mainViewport);
Point actualPos = new Point(
pos.X - mainViewport.ActualWidth / 2,
mainViewport.ActualHeight / 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(Math.Abs(dy) /
Math.Sqrt(Math.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(Math.Pow(dx, 2) + Math.Pow(dy, 2));
Transform3DGroup group = mGeometry.Transform as Transform3DGroup;
QuaternionRotation3D r =
new QuaternionRotation3D(
new Quaternion(axis, rotation * 180 / Math.PI));
group.Children.Add(new RotateTransform3D(r));
mLastPos = actualPos;
}
}
}
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.
Zobrazeno 7 zpráv z 7.