Skip to content

Commit

Permalink
feat: write aspheric lenses in extended lens file format
Browse files Browse the repository at this point in the history
  • Loading branch information
Latios96 committed Jul 7, 2024
1 parent 0a7ff12 commit 4134388
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,37 @@ std::string formatFloat(float t) {
return fmt::format("{:.3}", t);
}

void writeElements(std::string &content, const CameraLens &cameraLens) {
content += "[Elements]\n";

tabulate::Table styled_table;
styled_table.format().border("").border_left("").corner("").padding_left(0);
styled_table.add_row({"Radius", "Thickness", "IOR", "Housing-Radius", "Abbe-No", "Material", "Geometry"});
for (auto &element : cameraLens.elements) {
styled_table.add_row({formatFloat(element.curvatureRadius * 10), formatFloat(element.thickness * 10),
formatFloat(element.ior), formatFloat(element.apertureRadius * 10),
formatFloat(element.abbeNumber), fmt::format("{}", element.material.id),
fmt::format("{}", element.geometry)});
}

content += styled_table.str();
}

void writeAsphericElements(std::string &content, const CameraLens &cameraLens) {
content += "\n[Aspheric Coefficients]\n";
for (int i = 0; i < cameraLens.elements.size(); i++) {
const auto &element = cameraLens.elements[i];
if (element.geometry == LensGeometry::ASPHERICAL) {
const AsphericCoefficients &asphericCoefficients =
cameraLens.asphericCoefficients[*element.asphericCoefficientsIndex];
content += fmt::format("{}: k={} a2={} a4={} a6={} a8={} a10={} a12={} a14={}", i, asphericCoefficients.k,
asphericCoefficients.a2, asphericCoefficients.a4, asphericCoefficients.a6,
asphericCoefficients.a8, asphericCoefficients.a10, asphericCoefficients.a12,
asphericCoefficients.a14);
}
}
}

std::string LensFileExtendedFormatWriter::writeFileContent(const CameraLens &cameraLens) {
std::string content;

Expand All @@ -29,20 +60,12 @@ std::string LensFileExtendedFormatWriter::writeFileContent(const CameraLens &cam
writeMetadata(content, "Patent", cameraLens.metadata.patent);
writeMetadata(content, "Description", cameraLens.metadata.description);

content += "[Elements]\n";
writeElements(content, cameraLens);

tabulate::Table styled_table;
styled_table.format().border("").border_left("").corner("").padding_left(0);
styled_table.add_row({"Radius", "Thickness", "IOR", "Housing-Radius", "Abbe-No", "Material", "Geometry"});
for (auto &element : cameraLens.elements) {
styled_table.add_row({formatFloat(element.curvatureRadius * 10), formatFloat(element.thickness * 10),
formatFloat(element.ior), formatFloat(element.apertureRadius * 10),
formatFloat(element.abbeNumber), fmt::format("{}", element.material.id),
fmt::format("{}", element.geometry)});
if (cameraLens.hasAsphericElements()) {
writeAsphericElements(content, cameraLens);
}

content += styled_table.str();

return content;
}
} // crayg
23 changes: 22 additions & 1 deletion src/crayg/tests/TestLensFileExtendedFormatWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ TEST_CASE("LensFileExtendedFormatWriter::writeFileContent") {
canon70_200.metadata.patent = "US 123";
canon70_200.metadata.description = "Super nice lens";

CameraLens edmondAsphericLens = CameraLensFixtures::createEdmondAsphericLens();

for (auto &element : canon70_200.elements) {
element.material.id = LensMaterialId::UNKNOWN;
}

SECTION("should ") {
SECTION("should write Canon 70-200mm correctly") {
LensFileExtendedFormatWriter lensFileExtendedFormatWriter;

const std::string content = lensFileExtendedFormatWriter.writeFileContent(canon70_200);
Expand Down Expand Up @@ -64,6 +66,25 @@ Radius Thickness IOR Housing-Radius Abbe-No Material Geometry
148 3.62 1.74 21 49.3 UNKNOWN SPHERICAL
-206 54.5 1 21 0 UNKNOWN SPHERICAL )");
}

SECTION("should write Aspherics correctly") {
LensFileExtendedFormatWriter lensFileExtendedFormatWriter;

const std::string content = lensFileExtendedFormatWriter.writeFileContent(edmondAsphericLens);

REQUIRE(content == R"([Metadata]
Name: Edmond Optics Precision Aspheric Lens
Focal Length: 54.2
Maximum F Number: 1.08
Squeeze: 1
Elements Count: 2
[Elements]
Radius Thickness IOR Housing-Radius Abbe-No Material Geometry
24.2 21.5 1.81 50 25.4 SCHOTT_N_SF6 ASPHERICAL
0 18.1 1 50 0 AIR PLANAR
[Aspheric Coefficients]
0: k=-1.103426 a2=0 a4=4.605084e-06 a6=4.544628e-10 a8=-2.257169e-12 a10=5.828326e-16 a12=0 a14=0)");
}
}

}

0 comments on commit 4134388

Please sign in to comment.