Чтение данных из текстового файла в таблицу на чертеже (фрагменте)

Автор mustimur, 09.12.25, 21:02:02

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

mustimur

Многие здесь сталкивались с вопросом копирования таблиц на чертеж. Удобными предлагаемые методы не назовешь, а у меня в 24 версии не получилось скопировать таблицу из word/excel (вставляется как текст с табуляцией) - а перебивать ее то еще "удовольствие".
Мы часто используем текстовый файл с координатами, разделенными табуляцией (собственный софт генерирует). Для построения сплайна в Компасе идеально подходит, можно открыть в excel, но поместить в чертеж таблицу не удавалось по советам форума (может и руки у меня не из того места растут). Поэтому за вечер слепил консольное приложение, генерирующее файл Компас-таблицы или таблицу в новом фрагменте (по выбору пользователя). Ниже выкладываю код (VS C++) и программу, может кому пригодится - буду рад.
// KompasTab.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#pragma once
#include<fstream>
#include<iostream>
#include<string>
#include<vector>
#include<atlbase.h>
//#include <kapi7.h>
#import "C:\Program Files\ASCON\KOMPAS-3D v24\Bin\kAPI5.tlb"


#import "C:\Program Files\ASCON\KOMPAS-3D v24\Bin\kAPI7.tlb"




const double tab_h = 10.;
const double tab_w = 50.;

std::string ConvertLPWSTRToString(LPWSTR lpwstr) {
    int size_needed = WideCharToMultiByte(CP_ACP, 0, lpwstr, -1, NULL, 0, NULL, NULL);
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(CP_ACP, 0, lpwstr, -1, &strTo[0], size_needed, NULL, NULL);
    return strTo;
}


bool openfile(std::string* file_name)
{
    OPENFILENAME ofn;
    char szFile[260];
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);

    ofn.lpstrFile = (LPWSTR) szFile;

    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = (LPCWSTR)L"Текстовый файл\0*.TXT\0Все файлы\0*.*\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;


    if (GetOpenFileName(&ofn) == TRUE)
    {
        *file_name = ConvertLPWSTRToString(ofn.lpstrFile);
       
        return true;
    } else
    return false;
}

bool savefile(std::string* file_name)
{
    OPENFILENAME ofn;
    char szFile[260]="\0";
    char szDefExt[260] = "\0";
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);

    ofn.lpstrFile = (LPWSTR)szFile;

    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = (LPCWSTR)L"Комапас таблицы\0*.tbl\0Все файлы\0*.*\0";
    ofn.lpstrDefExt = (LPCWSTR)szDefExt;
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags =  OFN_FILEMUSTEXIST;


    if (GetSaveFileName(&ofn) == TRUE)
    {
        *file_name = ConvertLPWSTRToString(ofn.lpstrFile);

        return true;
    }
    else
        return false;
}


std::vector<std::string> splitString(const std::string& str, const std::string& delimiter) {
    std::vector<std::string> tokens;
    size_t start = 0, end;

    while ((end = str.find(delimiter, start)) != std::string::npos) {
        tokens.push_back(str.substr(start, end - start));
        start = end + delimiter.length();
    }
    tokens.push_back(str.substr(start));
    return tokens;
}



void create_tab7(std::vector <std::vector<std::string>> vvs, int mode)
{
    bool vis = (mode == IDYES);
    CoInitialize(NULL);
    KompasAPI7::IKompasAPIObjectPtr kompas;
    HRESULT hres = kompas.GetActiveObject(L"Kompas.Application.7");
    if (FAILED(hres))
        kompas.CreateInstance(L"Kompas.Application.7");
    kompas->Application->Visible = vis;
    KompasAPI7::IKompasDocumentPtr doc( kompas->Application->Documents->Add((KompasAPI7::DocumentTypeEnum) 2, vis));
    KompasAPI7::IKompasDocument2DPtr d2d(doc);
   KompasAPI7::IViewsAndLayersManagerPtr vlm=d2d->ViewsAndLayersManager;
   KompasAPI7::IViewsPtr VSP = vlm->Views;
   KompasAPI7::IViewPtr VP = VSP->ViewByNumber[0];
   KompasAPI7::ISymbols2DContainerPtr dc(VP);
   KompasAPI7::IDrawingTablesPtr DTS = dc->DrawingTables;
   KompasAPI7::IDrawingTablePtr DT = DTS->Add(vvs.size(), vvs[0].size(), tab_h, tab_w, (KompasAPI7::ksTableTileLayoutEnum)2);
   DT->X = 0;
   DT->Y = 0;
   DT->Update();
   KompasAPI7::ITablePtr It = DT;
   KompasAPI7::ITableCellPtr tcp;
   KompasAPI7::ITextPtr tx;
   for (int i = 0; i < vvs.size(); i++)
       for (int j = 0; j < (vvs[i]).size(); j++)
       {
          tcp = It->Cell[i][j];
           tx = tcp->Text;
           _bstr_t tx1((vvs[i])[j].c_str());
           tx->PutStr(tx1);
       
       }
   DT->Update();
   if (!vis)
   {
       std::string fname;
       if (savefile(&fname))
       {
           _bstr_t f_name(fname.c_str());
           DT->Save(f_name);
       }
   }
    CoUninitialize();
}



int main()
{
    std::string S, line_f;
    std::vector <std::vector<std::string>> vvs;

    if (openfile(&S))
    {
        std::ifstream infile(S);
        while (getline(infile, line_f))
        {
            vvs.push_back(splitString(line_f, "\t"));
        }
        int msgboxID = MessageBox(
            NULL,
            (LPCWSTR)L"Открыть таблицу во фрагменте?\nВыбирая 'Нет'- Вы вбираете сохранения в файл,\n'Отмена' -прерывания процесса.",
            (LPCWSTR)L"Account Details",
            MB_ICONQUESTION | MB_YESNOCANCEL
        );


        if (msgboxID!= IDCANCEL) create_tab7(vvs, msgboxID);
    }
    return 0;
}

// Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
// Отладка программы: F5 или меню "Отладка" > "Запустить отладку"

// Советы по началу работы
//   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
//   2. В окне Team Explorer можно подключиться к системе управления версиями.
//   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
//   4. В окне "Список ошибок" можно просматривать ошибки.
//   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
//   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.


KompasTab.rar