匿名
发表于 2025-3-17 16:07:11
#include "dllzbf.h"
#include <fstream>
#include <string>
#include <sstream>
//-----------------------------------------
// ZBF文件读取实现(根据实际文件格式修改)
//-----------------------------------------
bool ReadZBF(const char* filePath, ZBFData& data) {
std::ifstream file(filePath);
if (!file.is_open()) return false;
std::string line;
// 读取网格尺寸
std::getline(file, line);
sscanf_s(line.c_str(), "GridX=%d GridY=%d", &data.gridX, &data.gridY);
// 读取波长
std::getline(file, line);
sscanf_s(line.c_str(), "Wavelength=%lf", &data.wavelength);
double value;
while (file >> value) {
data.irradiance.push_back(value);
}
file.close();
return data.gridX * data.gridY == data.irradiance.size(); // 验证数据完整性
}
//-----------------------------------------
// UserParamNames 实现,可简化或删除,因为不再依赖外部参数
//-----------------------------------------
extern "C" __declspec(dllexport) const char** __stdcall UserParamNames() {
return nullptr;
}
//-----------------------------------------
// UserSourceDefinition 实现(64位关键修正)
//-----------------------------------------
extern "C"
double* UserParams()
{
return nullptr;
}
__declspec(dllexport) int __stdcall UserSourceDefinition(
int* mode, double* ray, double* flux, char* errorMsg
) {
static ZBFData zbfData;
static int currentIndex = 0;
static bool initialized = false;
if (*mode == 0) { // 初始化模式
const char* zbfPath = "C:\\Users\\xuxuxu\\Documents\\Zemax\\POP\\BEAMFILES\\sample.zbf";
if (!ReadZBF(zbfPath, zbfData)) {
strcpy_s(errorMsg, 256, "ZBF文件加载失败");
return 1;
}
initialized = true;
currentIndex = 0;
return 0;
}
else if (*mode == 1 && initialized) { // 生成光线模式
if (currentIndex >= zbfData.irradiance.size()) return -1;
const double scale = 1.0; // 可自行设置默认缩放因子,这里设为1.0
const int x = currentIndex % zbfData.gridX;
const int y = currentIndex / zbfData.gridX;
ray[0] = (x / static_cast<double>(zbfData.gridX - 1) - 0.5) * scale; // X (mm)
ray[1] = (y / static_cast<double>(zbfData.gridY - 1) - 0.5) * scale; // Y (mm)
ray[2] = 0.0; // Z(mm)
ray[3] = 0.0; // 方向余弦L
ray[4] = 0.0; // 方向余弦M
ray[5] = 1.0; // 方向余弦N
ray[6] = zbfData.wavelength; // 波长 (µm)
*flux = zbfData.irradiance[currentIndex];
currentIndex++;
return 0;
}
else {
strcpy_s(errorMsg, 256, "未初始化或模式错误");
return 2;
}
}帮我看下,这段生成dll代码的光源设置有问题吗
|
|