отзыв duxe.ru отзывы duxe.ru Шаговые двигатели и контроллеры в моем магазине duxe.ru

самодельный станок с ЧПУ, отзывы duxe.ru

Объявление

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » самодельный станок с ЧПУ, отзывы duxe.ru » Программа VRI-cnc » Не стреляйте - помогите


Не стреляйте - помогите

Сообщений 1 страница 7 из 7

1

Уважаемые, всех с праздничком! Не задоблал я тут Вас еще ? однотипные вопросы все задаю...) Вобщем собрал я схемку Вашу, почти полностью переписал вашу програмку (всмысле написал свою, но очень похожая на вашу), но немогу понять как вы добились чтения КАДовских файлов???
а еще лучше - подскажите плиз, какие есть программы который могут работать с той схемой на триггерах, как и ваша, но ТОЛЬКО не демо... А то Ваша ДЕМО сильно подпортит мне сдачу диплома вылезающим окошком ЭТО ДЕМО_ВЕРСИЯ ))))) Вот комиссия удивица))) а если еще и винда ошибку в дровах выдаст - вообще финиш))) Ваша прога вцелом неплохая, но для студентов наверное стоило бы и бесплатно сделать..)) хотя, не мне судить..Если подскажите - буду очень благодарен - а то Ваша прога у меня работает не всегда и не всегда так как я хочу)

И еще вопрос, может быть не по теме, извините - но где написано куда в LPT-порт концевики втыкать ???

Спасибо!

Отредактировано DrZugrik (2008-05-02 00:38:58)

0

2

про DXF поищи в инете "спецификация DXF".

0

3

За спецификацию спасибо - хоть один челоовек откликнулся..... стыдно вам должно быть, товарищи..

0

4

DrZugrik, там на самом деле ничего сложного нет. Я разобрался с DXF форматом буквально за 2 часа. Если нужно просто примитивы читать (линии, окружности и т.д.), то нужно рассматривать тольк осекцию ENTITIES.

В качестве примера приведу кусочек кода, который я накатал на скорую руку, для пробы...
Всё написано кривовато, но работает :)

Код:
unit DXF;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Dialogs;

type
  LINE = record
    Name:String;
    x1,x2:real;
    y1,y2:real;
    z1,z2:real;
    end;
  LINES = record
    Count:cardinal;
    List:array of LINE;
    end;

  procedure InitDXF;
  function OpenDXF(FileName:String):Boolean;
  function GetLines(var lns:LINES):Boolean;

implementation

var
  FName:String;
  DXFFile:TStringList;

function StrToVal(Str:String):Real;
begin
Str[pos('.',Str)]:=',';
result:=StrToFloat(Str);
end;

procedure InitDXF;
begin
FName:='';
DXFFile:=TStringList.Create;
end;

function OpenDXF(FileName:String):Boolean;
begin
result:=true;
FName:=FileName;
try
  DXFFile.LoadFromFile(FileName);
  except
  result:=false;
  FName:='';
  end;
end;

function GetLines(var lns:LINES):Boolean;
var i,start,finish,c:cardinal;
    LineFlag:Boolean;
begin
c:=0;
result:=true;
if (DXFFile.Count>6) then
  begin
  //Поиск начала секции ENTITIES
  i:=0;
  while (DXFFile.Strings[i]<>'  0') or (DXFFile.Strings[i+1]<>'SECTION') or
        (DXFFile.Strings[i+2]<>'  2') or (DXFFile.Strings[i+3]<>'ENTITIES') do
    if ((DXFFile.Count-4)>i) then
      i:=i+1
    else
      begin
      result:=false;
      exit;
      end;
  start:=i;

  //Поиск конца секции ENTITIES
  while (DXFFile.Strings[i]<>'  0') or (DXFFile.Strings[i+1]<>'ENDSEC') do
    if ((DXFFile.Count-2)>i) then
      begin
      //Подсчёт линий
      if (DXFFile.Strings[i]='  0') and (DXFFile.Strings[i+1]='LINE') then
        begin
        c:=c+1;
        i:=i+1;
        end;
      i:=i+1;
      end
    else
      begin
      result:=false;
      exit;
      end;
  finish:=i;

  lns.Count:=c;
  SetLength(lns.List,lns.Count);
  c:=0;

  //Поиск примитивов
  LineFlag:=false;
  i:=start;
  while i<finish do
    begin
    //Поиск линии
    if (DXFFile.Strings[i]='  0') then
      LineFlag:=false;
    if (DXFFile.Strings[i+1]='LINE') then
      begin
      LineFlag:=true;
      c:=c+1;
      i:=i+1;
      continue;
      end;
    if LineFlag then
      begin
      //Поиск идентификатора
      if (DXFFile.Strings[i]='  5') then
        begin
        lns.List[c-1].Name:=DXFFile.Strings[i+1];
        i:=i+1;
        end;
      //Поиск координаты х1
      if (DXFFile.Strings[i]=' 10') then
        begin
        lns.List[c-1].x1:=StrToVal(DXFFile.Strings[i+1]);
        i:=i+1;
        end;
      //Поиск координаты х2
      if (DXFFile.Strings[i]=' 11') then
        begin
        lns.List[c-1].x2:=StrToVal(DXFFile.Strings[i+1]);
        i:=i+1;
        end;
      //Поиск координаты у1
      if (DXFFile.Strings[i]=' 20') then
        begin
        lns.List[c-1].y1:=StrToVal(DXFFile.Strings[i+1]);
        i:=i+1;
        end;
      //Поиск координаты у2
      if (DXFFile.Strings[i]=' 21') then
        begin
        lns.List[c-1].y2:=StrToVal(DXFFile.Strings[i+1]);
        i:=i+1;
        end;
      //Поиск координаты z1
      if (DXFFile.Strings[i]=' 30') then
        begin
        lns.List[c-1].z1:=StrToVal(DXFFile.Strings[i+1]);
        i:=i+1;
        end;
      //Поиск координаты z2
      if (DXFFile.Strings[i]=' 31') then
        begin
        lns.List[c-1].z2:=StrToVal(DXFFile.Strings[i+1]);
        i:=i+1;
        end;
      end;

    i:=i+1;
    end;
  end;
end;

end.

Это модуль DXF.pas.
Реализована только функция поиска линий. Окружности и всё остальное можно сделать по аналогии, хотя я бы лучше переделал всё :)

Для примера:

Код:
uses ... DXF, ...;

...

var
  LinesList:LINES;


.....

if (OpenDialog.Execute) then
  if (FileExists(OpenDialog.FileName)) then
    if (OpenDXF(OpenDialog.FileName)) then
      if (GetLines(LinesList)) then
        begin
        ListView1.Items.Clear;
        if LinesList.Count>0 then
          for i:=0 to LinesList.Count-1 do
            begin
            item:=ListView1.Items.Add;
            item.Caption:=LinesList.List[i].Name;
            item.SubItems.Add(FloatToStr(LinesList.List[i].x1)+';'+FloatToStr(LinesList.List[i].y1)+';'+FloatToStr(LinesList.List[i].z1));
            item.SubItems.Add(FloatToStr(LinesList.List[i].x2)+';'+FloatToStr(LinesList.List[i].y2)+';'+FloatToStr(LinesList.List[i].z2));
            end;
        end
    else
      MessageDlg('Ошибка при открытии файла',mtError,[mbOK],0);

....

Тут заполняется TListView линиями (их координамами)...

0

5

2mr_Coder
Спасибо огромное, сейчас буду пробовать!!! Если что-то будет неясно я к Вам еще обращусь))

0

6

Уважаемый, что-то несростается((
При компиляции ошибка выдается:

[Pascal Error] Unit1.pas(559): E2010 Incompatible types: 'string' and 'TListItem'
[Pascal Error] Unit1.pas(560): E2018 Record, object or class type required
[Pascal Error] Unit1.pas(561): E2018 Record, object or class type required
[Pascal Error] Unit1.pas(562): E2018 Record, object or class type required
[Pascal Fatal Error] Project1.dpr(17): F2063 Could not compile used unit 'Unit1.pas'

Ошибку показывает вот в этом месте :

begin
            item:=ListView1.Items.Add;
            item.Caption:=LinesList.List[i].Name;
            item.SubItems.Add(FloatToStr(LinesList.List[i].x1)+';'+FloatToStr(LinesList.List[i].y1)+';'+FloatToStr(LinesList.List[i].z1));
            item.SubItems.Add(FloatToStr(LinesList.List[i].x2)+';'+FloatToStr(LinesList.List[i].y2)+';'+FloatToStr(LinesList.List[i].z2));

            end;

0

7

Да тебе зачем листвью? Все координаты всех линий и их идентификаторы будут храниться в переменной LinesList. Просто этот код демонстрирует, как обращаться к ним...

for i:=1 to LinesList.Count do
  begin
  LinesList.List[i].Name // это идентификатор i-й линии

  // это координаты i-й линии

  LinesList.List[i].x1 
  LinesList.List[i].x2
  LinesList.List[i].y1
  LinesList.List[i].y2
  LinesList.List[i].z1
  LinesList.List[i].z2

  end;

0


Вы здесь » самодельный станок с ЧПУ, отзывы duxe.ru » Программа VRI-cnc » Не стреляйте - помогите